REST API返回102 HTTP状态码时响应头缺失问题求助
排查HTTP 102响应头丢失问题的思路和解决方案
我之前在处理REST API异步导出功能时,也碰到过类似的102状态码响应头丢失的坑,结合你给出的新旧配置差异,给你几个具体的排查方向和解决办法:
1. 先区分是服务器配置还是框架的问题
首先排除Lumen的影响,写一个简单的原生PHP脚本测试102响应:
<?php // 手动添加你需要的响应头 header('Access-Control-Allow-Origin: *'); header('Cache-Control: no-cache, no-store, must-revalidate'); header('Content-Type: application/json'); // 设置102状态码 http_response_code(102); echo json_encode(['status' => 'processing']); ?>
用curl -v http://你的服务器地址/test.php访问,查看响应头是否完整:
- 如果原生PHP返回的102响应头正常,那问题出在Lumen的响应处理逻辑上
- 如果原生PHP也没有响应头,那就是Apache或PHP的配置问题
2. 针对Lumen框架的调整
如果是框架的问题,大概率是response()->json()在处理非2xx状态码时,没有自动填充默认响应头。你可以手动强制添加所需的响应头:
public function getItem(int $id) { if($export = Export::find($id)) { $this->authorize(__FUNCTION__, $export); if($export->status != Export::STATUS_COMPLETED) { return response()->json($export, 102) ->header('Access-Control-Allow-Origin', '*') // 替换成你的实际允许域名 ->header('Cache-Control', 'no-cache, no-store, must-revalidate') ->header('Content-Type', 'application/json') ->header('Date', gmdate('D, d M Y H:i:s T')) // 其他你需要的响应头... ; } return response()->json($export); } throw new ModelNotFoundException(); }
Lumen的响应类在处理非标准状态码时,可能不会自动注入某些默认头,手动添加后应该能正常显示。
3. Apache配置的排查
从你的版本变化来看,Apache从2.4.27升到了2.4.29,这个版本可能对临时响应状态码(比如102)的处理有调整:
- 检查mod_headers模块:确保
mod_headers已经启用(执行a2enmod headers),并且没有配置拦截102状态码的规则 - 检查mod_security:如果启用了mod_security,它可能会拦截非标准状态码的响应头,可以临时关闭测试(执行
a2dismod security2后重启Apache) - FastCGI配置(如果用PHP-FPM):如果是通过FastCGI运行PHP,需要确保Apache的FastCGI配置允许传递非标准状态码。可以在虚拟主机配置中添加:
这个配置会让Apache把所有状态码原样传递给客户端,而不是只处理标准的2xx/4xx/5xx。ProxyFCGIBackendType GENERIC
4. 其他辅助排查点
- 查看Apache的
error.log和PHP的错误日志,看看有没有处理102状态码时的异常信息 - 对比新旧环境的Apache配置文件(比如
httpd.conf、虚拟主机配置),排查是否有新增的规则影响了响应头
内容的提问来源于stack exchange,提问作者Schnapse
相关产品推荐
相关产品推荐

