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

为何我的代码在nginx/php-fpm环境下始终返回HTTP 200而非预期404状态码

问题根因及解决方案

这个问题的排查可以按以下两个方向定位:

1. 优先确认DTO状态码赋值逻辑

你自定义响应和标准响应的唯一差异是状态码取自$body->getStatus(),而非硬编码的404,首先要确认该值在Docker环境下的实际返回:
在ResponseProvider::render方法中添加日志,将$body->getStatus()的结果写入本地日志,对比Docker环境和本地内置服务器的输出:

  • 如果Docker环境下该值返回200:问题出在业务逻辑层,和php-fpm、Nginx无关。大概率是Docker环境中的依赖包版本、环境变量和本地不一致导致的:
    • 检查ENTITY_NOT_FOUND_Message类的状态码定义,确认大小写、命名空间是否符合Linux文件系统的大小写敏感要求
    • 确认phpcommon/http扩展包的版本和本地一致,composer.lock文件已同步到Docker镜像中,避免版本差异导致的逻辑不一致
  • 如果Docker环境下该值确实返回404:问题出在Nginx的FastCGI配置上

2. Nginx配置修复方案

如果确认PHP侧确实返回了404状态码,只需调整Nginx配置即可:

  • 在location ~ \.php$配置块中显式添加fastcgi_intercept_errors off;,关闭Nginx对FastCGI响应错误的拦截,避免Nginx用自身的错误页规则覆盖PHP返回的状态码
  • 检查fastcgi_params配置文件,确认没有强制改写状态码的规则,同时在php.ini中设置cgi.rfc2616_headers = On,保证PHP返回标准HTTP状态码头可以被Nginx正常识别
  • 额外优化:你当前配置中X-Frame-Options的add_header规则没有加always参数,会导致4xx响应中缺失这个头,建议修改为add_header X-Frame-Options 'SAMEORIGIN' always;;如果没有特殊需求可以删掉error_page 405 =200 $uri;规则,避免非预期的状态码改写

内容的提问来源于stack exchange,提问作者Mila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:54:05