如何阻止Nginx对PHP页面请求返回304状态码?
问题分析与解决方案
核心原因
Nginx返回304并非因为自身缓存了PHP内容,而是默认处理了HTTP协商缓存逻辑:
- 当Google机器人发送请求时,会带上之前响应中的
If-Modified-Since(对应Last-Modified头)或If-None-Match(对应ETag头)条件请求头 - 如果PHP-FPM之前的响应返回过
Last-Modified/ETag,Nginx会自动对比这些头的值,若判定内容未变更,就直接返回304,无需再转发请求到PHP-FPM
解决步骤
1. 彻底禁用协商缓存与缓存头
在你的PHP location块中添加以下配置,强制覆盖所有缓存相关响应头,并关闭Nginx的协商缓存处理:
location ~ \.php$ { limit_req zone=zone_page_php burst=20; # 关闭Nginx的ETag和Last-Modified自动处理 etag off; if_modified_since off; # 强制设置缓存禁用头,always确保所有响应都生效 add_header Cache-Control "no-cache, no-store, must-revalidate" always; add_header Pragma "no-cache" always; add_header Expires "0" always; include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; }
2. 检查fastcgi配置是否暗藏缓存
打开snippets/fastcgi-php.conf,确认其中没有以下缓存相关配置,若有直接删除:
fastcgi_cache(开启fastcgi缓存)fastcgi_cache_valid(设置缓存有效期)fastcgi_cache_key(定义缓存键)
3. 验证效果
重启Nginx后,用curl模拟Googlebot的条件请求:
curl -I -H "If-Modified-Since: 之前的Last-Modified值" -H "If-None-Match: 之前的ETag值" http://你的域名/test.php
若返回状态码为200,且响应头包含Cache-Control: no-cache, no-store, must-revalidate,则配置生效。
内容的提问来源于stack exchange,提问作者user24236542
相关产品推荐
相关产品推荐

