PHP curl访问含5位machineID路径失败但bash curl正常如何排查
问题根因定位
对比两份日志的请求路径可以直接发现核心差异:
- bash curl正常请求的路径为
POST /machines/xxxxx/dosomething HTTP/2(路径最后一段为全小写的dosomething) - PHP curl异常请求的路径为
POST /machines/xxxxx/doSomething HTTP/2(路径最后一段为驼峰写法的doSomething)
绝大多数运行在Linux环境下的服务端路由、Nginx路径匹配规则默认是大小写敏感的,路径拼写不匹配会导致路由命中失败。你遇到的返回200但业务异常的情况,通常是服务端做了全局兜底规则,未匹配到路由时也返回200状态码和通用响应结构,没有返回404状态码导致调试干扰。
6位machineID的路径可以正常运行,大概率是该规则在服务端同时兼容了大小写两种写法,或者你测试时拼写碰巧和服务端定义一致。
解决方案
- 统一路径拼写:将PHP代码中请求的路径改为和服务端定义完全一致的格式,优先测试全小写的
dosomething写法,保证和bash curl的请求路径完全相同。 - 消除其他请求头差异:测试时将PHP curl的User-Agent设置为和bash curl一致的
curl/7.58.0,避免部分服务端针对特殊UA做拦截或规则限制:
curl_setopt($curl, CURLOPT_USERAGENT, 'curl/7.58.0');
- 排除HTTP/2适配问题:如果修改后仍异常,可以强制使用HTTP/1.1发送请求,规避HTTP/2的底层适配差异:
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
- 全参数对比验证:如果以上方案都无效,可以使用
curl_getinfo()函数打印PHP curl的全部请求参数,和bash curl的参数逐行对比,排查是否有自动添加的隐藏请求头、Cookie、编码差异等问题。
内容的提问来源于stack exchange,提问作者tanawat yakit
相关产品推荐
相关产品推荐

