【问题标题】:Nginx Error Pages - One Location Rule to Fit Them All?Nginx 错误页面 - 一个适合它们的位置规则?
【发布时间】:2012-11-17 07:09:34
【问题描述】:

具有以下 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 冗余?

【问题讨论】:

    标签: nginx error-handling http-status-code-404


    【解决方案1】:
    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;
    }
    

    【讨论】:

    • 优秀的解决方案。如果有人对此完全陌生,请注意您仍然需要在 /var/www/default 中创建“错误”文件夹
    • ...或者使用alias而不是root,然后直接从/var/www/default/读取文件,而不是/var/www/default/error/
    • 我想要一个服务器块来响应任何配置的服务器名称(例如,将提供 404 页面的 IP 地址)。我希望该页面是自定义的。我写道:listen 80 default_server; server_name default; return 404; error_page 404 /errors/404.html; location ^~ /errors/ { internal; root /var/www; }。我仍然得到默认的 nginx 404 错误页面。 return 404; 是否适用于自定义页面?
    • 提示:如果您的错误页面正在使用来自同一目录的静态文件(如 images/css/...),则省略 internal;
    猜你喜欢
    • 2019-07-21
    • 2012-03-23
    • 1970-01-01
    • 2023-03-18
    • 2016-05-30
    • 1970-01-01
    • 2016-02-27
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多