You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:35:00