我的 Nginx 配置基本按照我想要的方式工作,它:
- 尝试从节点获取页面,
- 如果出现 404,请尝试从不同主机上的旧版网站获取页面
- 如果旧版网站的返回 404,则显示新网站的 404 页面(而不是旧版网站的 404 页面)。
注意:这是一个envsubst
模板。
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_read_timeout 60;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_buffers 16 64k;
proxy_buffer_size 2k;
proxy_temp_file_write_size 64k;
proxy_pass http://nodejs;
proxy_intercept_errors on;
recursive_error_pages on;
error_page 404 = @legacy;
location /404 {
# serve up /404 from the node server
internal;
proxy_intercept_errors off;
recursive_error_pages off;
proxy_pass http://nodejs;
}
}
location @legacy {
# when we can't find a page on the new server, try to find it on the
# old web server. If still not found, show new site's 404 page.
# NOTE: unfortunately, this can result in a 2nd call to our node
# servers, even though we already have the response from them.
proxy_pass ${LEGACY_URL};
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_intercept_errors on;
recursive_error_pages on;
error_page 404 = /404;
}
问题是:
- 如果旧版站点出现 404,则会向我的节点后端发出第二个请求。
- 第二个请求不会有原始路径信息,它将有/404。
此时有什么方法可以让 Nginx 返回原始节点 404 响应吗?