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

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

以下是 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;
    }
}

答案1

很抱歉这个答案来晚了,但就目前而言,使用当前的 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;
    }
}

相关内容