Skip to main content
 首页 » 编程设计

Nginx 错误页面之一个位置规则来适应它们

2024年09月07日16yjmyzz

具有以下 nginx vhost 配置:

server { 
    listen 80; 
    listen 443 ssl; 
    server_name default; 
    root /var/www/default/html; 
    error_log /var/www/default/log/error.log; 
    access_log /var/www/default/log/access.log; 
    ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; 
    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; 
 
    autoindex on; 
    index index.html index.php; 
 
    location / { 
        try_files $uri $uri/ @php; 
    } 
 
    location @php { 
        rewrite ^/(.*)/?$ /index.php/$1 last; 
    } 
 
    location ~* /(?:[.]|.*[.](?:bak|fla|inc|ini|log|psd|sh|sql|swp)|(?:file|upload)s?/.*[.](?:php)) { 
        deny all; 
    } 
 
    location ~* [.](?:php) { 
        fastcgi_buffer_size             128k; 
        fastcgi_buffers                 4 256k; 
        fastcgi_busy_buffers_size       256k; 
        fastcgi_connect_timeout         30; 
        fastcgi_ignore_client_abort     off; 
        fastcgi_index                   index.php; 
        fastcgi_intercept_errors        on; 
        fastcgi_pass                    unix:/var/run/php5-fpm.sock; 
        fastcgi_read_timeout            60; 
        fastcgi_send_timeout            60; 
        fastcgi_split_path_info         ^(.+[.]php)(/.*)$; 
        fastcgi_temp_file_write_size    256k; 
 
        include /etc/nginx/fastcgi_params; 
    } 
 
    error_page 403 /403.html; location = /403.html { 
        root /var/www/default/error; 
    } 
 
    error_page 404 /404.html; location = /404.html { 
        root /var/www/default/error; 
    } 
 
    error_page 405 /405.html; location = /405.html { 
        root /var/www/default/error; 
    } 
 
    error_page 500 501 502 503 504 /5xx.html; location = /5xx.html { 
        root /var/www/default/error; 
    } 
} 

是否可以通过单个位置规则处理 40x 和 50x 错误?就像是:
error_page 403 /403.html; 
error_page 404 /404.html; 
error_page 405 /405.html; 
error_page 500 501 502 503 504 /5xx.html; 
 
location ~ /(?:40[345]|5xx)[.]html$ { 
    root /var/www/default/error; 
} 

如果我在上面,我总是得到 nginx 默认的 404 错误。字符串匹配(无运算符)和精确匹配( = 运算符)有效,但使用区分大小写的 [in] 正则表达式运算符( ~[*] )则无效。

我想问题是处理位置块的顺序。

有没有办法克服这个问题以减少不需要的 root冗余?

请您参考如下方法:

error_page 403 /error/403.html; 
error_page 404 /error/404.html; 
error_page 405 /error/405.html; 
error_page 500 501 502 503 504 /error/5xx.html; 
 
location ^~ /error/ { 
    internal; 
    root /var/www/default; 
} 
  • http://nginx.org/r/location
  • http://nginx.org/r/error_page
  • http://nginx.org/r/root