![nginx - 根据 proxy_pass 响应更改 error_page](https://linux22.com/image/635456/nginx%20-%20%E6%A0%B9%E6%8D%AE%20proxy_pass%20%E5%93%8D%E5%BA%94%E6%9B%B4%E6%94%B9%20error_page.png)
是否可以根据上游代理的响应来更改后备的error_page?
upstream serverA {
server servera.com;
}
upstream serverB {
server serverb.com;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
proxy_set_header Host $host;
proxy_pass http://serverA;
proxy_intercept_errors on;
# if serverA returns 'hard' 404
# IE returns X-HARD-404=true header
return 404;
# else I would like to fallback to server-b
error_page 403 404 500 502 504 = @serverB;
}
我想这样做的原因是我们的设置存在问题。通常,我们会向服务器 a 发送请求,如果返回 404,我们会要求服务器 b 返回页面。在这种情况下,我们不希望服务器 b 返回其页面,并且我们希望明确返回 404,而不尝试服务器 b。
答案1
您还可以直接从 nginx 提供错误页面。
如果服务器 A 给出 404,则从 /your/nginx/html/directory/ 发送 404.html,而不涉及服务器 B
server {
listen 80;
location / {
proxy_pass http://serverA/;
proxy_intercept_errors on;
proxy_redirect off;
error_page 404 /404.html;
}
location /404.html {
root /your/nginx/html/directory/;
}
}
答案2
你可以尝试这个:
location / {
...
error_page 404 = @check_header;
error_page 403 500 502 504 = @serverB;
}
location @check_header {
if ($upstream_http_x_hard_404) {
return 404;
}
return 403;
error_page 403 = @serverB;
}