我有带后端 nodejs/php-fpm 后端的 nginx,如何告诉 nginx 不要缓存响应 5xx 或 4xx,即使它与缓存参数匹配。
PHP/Node.js 标头通过 http 标头响应长缓存时间:
HTTP/1.1 500 Internal Server Error
Date: Thu, 09 Mar 2017 09:41:03 GMT
Pragma: public
Expires: Thu, 09 Mar 2018 09:41:03 GMT
Cache-Control: public, max-age=31536000
X-Accel-Expires: Thu, 09 Mar 2018 09:41:03 GMT
即使状态代码为 500,响应也会缓存,如何防止这种情况?
nginx配置:
location / {
proxy_cache_methods GET;
proxy_cache_key $request_uri;
proxy_cache cache;
proxy_cache_valid 200 1h;
proxy_cache_use_stale error timeout invalid_header updating;
proxy_cache_bypass 0;
proxy_no_cache 0;
proxy_redirect off;
proxy_pass http://node-app;
}
答案1
嗯,这很奇怪,你的后端发送了Cache-Control
4xx/5xx 错误的标头。
proxy_cache_valid
Nginx 可以通过指令进行配置或者Cache-Control
它可以从/ /... 标头中获取缓存设置Expires
。此选项可以混合使用,但不适合你的情况。
因此,您有两个选择:
Cache-Control
要求您的开发人员在不需要时不要发送标头(例如 4xx/5xx 代码)- 配置 Nginx 以禁用
Expires
/Cache-Control
后端响应标头的处理proxy_ignore_headers。
答案2
默认情况下,nginx 将尊重Cache-Control
从后端接收到的代理缓存,例如https://forum.nginx.org/read.php?2,268813,268814
因此,最好的解决方案似乎是更改后端,以便在出现错误时停止发出这些标题。
如果你真的想覆盖 nginx 中的那些 500,也许可以使用proxy_cache_valid使用 500 和 0 作为参数?这肯定意味着要对后端进行二次猜测,因此无论如何都可能产生意想不到的后果。