nginx - 根据 proxy_pass 响应更改 error_page

Nat*_*Lee 4 nginx http-headers

是否可以根据上游代理的响应更改后备 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;
}
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因是我们的设置存在问题。通常我们向服务器 a 发送请求,如果返回 404,我们会要求服务器 b 返回页面。在这种情况下,我们不希望 server-b 返回其页面,并且我们希望显式返回 404,而不尝试 server-b。

小智 5

您还可以直接从 nginx 提供错误页面。

如果 serverA 给出 404,则从 /your/nginx/html/directory/ 发送 404.html,而不涉及 serverB

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/;
    }
}
Run Code Online (Sandbox Code Playgroud)