Nginx+PHP架构下预取请求返回503错误的处理咨询
Nginx+PHP架构下预取请求返回503错误的处理咨询
我这边有个用Nginx部署的PHP应用/网站,最近用Chrome开着开发者工具的网络面板逛网站时发现个问题:每次跳转到新页面之前,都会先发一个**prefetch(预取)**请求,但服务器给这个请求返回的是503(服务不可用)状态码。目前网站是通过CloudFlare做反向代理的,我挺担心这些503错误会不会影响网站的正常运行或者搜索引擎收录,想请教下是不是得调整Nginx配置来正确处理这类预取请求?
截图说明:
- 第一张截图显示了两次请求,其中一次明确标记为预取请求
- 第二张截图展示了预取请求对应的响应头信息
先分析可能的原因
出现这种情况,大概率是下面几个环节出了问题:
- CloudFlare的拦截或缓存策略:CloudFlare可能把预取请求识别成了异常流量,或者缓存规则没适配
Purpose: prefetch这个请求头,直接返回了503。 - Nginx配置未兼容预取请求:你的Nginx配置可能对某些请求头或请求类型做了限制,导致预取请求没被正常转发到PHP-FPM。
- PHP应用的逻辑限制:PHP代码里可能有针对请求头的判断,不小心拒绝了带有
Purpose: prefetch的请求。
具体的处理步骤
1. 调整Nginx配置,适配预取请求
你可以在Nginx的server配置块里添加专门针对预取请求的处理规则,确保它能正常传递给PHP:
# 识别预取请求并做针对性处理 if ($http_purpose = "prefetch") { # 标记已处理预取请求(可选,方便调试) add_header X-Prefetch-Handled "Success"; # 确保请求转发到PHP-FPM,这里换成你实际的PHP-FPM地址 fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
或者更通用的,在主location块里允许预取请求的相关头:
location / { try_files $uri $uri/ /index.php?$query_string; # 允许预取请求携带的Purpose头 add_header Access-Control-Allow-Headers "Purpose"; }
2. 检查CloudFlare的相关设置
- 登录CloudFlare后台,先看安全→WAF规则,有没有拦截带有
Purpose: prefetch的请求,如果有,直接调整规则放行就行。 - 再去缓存→缓存规则里,给预取请求设置合适的缓存策略,比如允许缓存或者直接回源(根据你的网站需求来)。
- 也可以检查下网络模块里的HTTP/2、HTTP/3设置,确保预取请求的协议支持没问题。
3. 排查PHP应用的处理逻辑
打开你的PHP入口文件(比如index.php),添加日志记录预取请求的细节,看看是不是代码里有返回503的逻辑:
if (isset($_SERVER['HTTP_PURPOSE']) && $_SERVER['HTTP_PURPOSE'] === 'prefetch') { // 记录预取请求到日志,方便排查 error_log('Prefetch Request: ' . $_SERVER['REQUEST_URI'] . ' | IP: ' . $_SERVER['REMOTE_ADDR']); // 确保这里没有主动返回503的代码 }
额外小技巧
你可以先绕过CloudFlare,直接在服务器本地或者用hosts指向服务器IP测试预取请求,如果还是返回503,那问题就出在Nginx或PHP上;如果正常了,那就是CloudFlare的配置问题,这样能快速定位根源。另外,记得查看Nginx的错误日志(比如/var/log/nginx/error.log),里面大概率会有预取请求报错的具体信息,帮你更快找到问题。
备注:内容来源于stack exchange,提问作者Ade
相关产品推荐
相关产品推荐

