Nginx 错误页面 - 一个位置规则来适应它们? [英] Nginx Error Pages - One Location Rule to Fit Them All?

查看:15
本文介绍了Nginx 错误页面 - 一个位置规则来适应它们?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

具有以下 nginx vhost 配置:

Having the following nginx vhost config:

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 错误?类似的东西:

Is it possible to have the 40x and 50x errors served by a single location rule? Something like:

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] 正则表达式运算符 (~[*]) 则不起作用

If the I the above, I always get the nginx default 404 errors. String matches (no operator) and exact matches (= operator) work, but with the the case-[in]sensitive regex operator (~[*]) it doesn't.

我猜问题是处理位置块的顺序.

I guess the problem is the order in which the location blocks are processed.

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

Is there anyway to overcome that to reduce the unneeded root redundancy?

推荐答案

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;
}

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆