为什么Nginx的proxy_intercept_errors指令需要重写才能正常工作?


8

以下是Nginx服务器配置示例。没有“魔术符”位置块,代理的错误内容将导致Nginx 404页面,而不是提供自定义的错误页面。

删除proxy_intercept_errors指令可为带有正确的http错误代码标头的正确的代理错误页面提供服务。

不管魔术护身符的存在如何,都能正确呈现非代理错误页面。

关于到底发生了什么的任何想法?

server {
    server_name     mydomain.com "";
    listen          80;
    root            /var/www;
    error_page      400 401 402 403 404 500 501 502 503 504 /admin/error_page.htm;
    proxy_intercept_errors on;

    location /proxy/ {
        proxy_read_timeout  60s;
        proxy_set_header    Host $host;
        proxy_pass          http://myservers;
    }

    location /test404/ {
        return 404;
    }

    location /admin/ {    # this line constitute a magical talisman that fixes proxied error interception(???)(!)
        rewrite ^(/admin)(.*)$ /admin$2 break;
    }
}

Answers:


4

很抱歉,这个答案迟到了,直到现在,使用当前的v1.8.1稳定版本,您提供的配置都可以正常运行而无需任何护符

如果您提供了正在试用的版本,则最好查看是否已纠正错误或配置是否有缺陷。

我建议您仔细检查您的配置,因为您绝对不需要此/admin/位置及其包含的rewrite指令。请特别谨慎地删除所有不属于本测试(并且您没有显示)的内容,因为它可能会干扰您的工作。

作为最后的选择,您可以尝试以下成功测试的配置摘要,并缓慢地集成更改,然后查看结果与预期有何不同:

server {
    listen      80;
    listen      [::]:80;
    server_name example.org;

    location /proxy {
        return 418 "Host: $host, Connection: $http_connection";
    }
}

server {
    listen      80;
    listen      [::]:80;
    server_name example.com;

    root /var/ious/files;

    error_page 418 = /error_page.html;
    proxy_intercept_errors on;

    location /proxy {
        proxy_pass http://example.org;
    }
}

谢谢,伯纳德。我将您的答案标记为已接受,因为已经过去了足够的时间,我不再想起最初提出问题时针对哪个Nginx版本进行了测试。
Aubrey Falconer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.