PHP接口接收Raw JSON报404,Raw Text正常的问题求助
核心差异点:两种提交方式的唯一区别是请求头的Content-Type——Raw JSON模式会发送Content-Type: application/json,而Raw Text模式通常用text/plain或默认的application/x-www-form-urlencoded。结合本地正常、虚拟主机异常的情况,重点排查以下几个方向:
检查虚拟主机的
.htaccess伪静态规则
不少虚拟主机的Rewrite规则会拦截非表单格式的请求。可以先临时注释掉.htaccess里的所有Rewrite规则,测试Raw JSON请求是否还返回404。如果恢复正常,就需要调整规则,允许application/json类型的请求访问你的API文件。示例调整代码:# 允许POST请求且Content-Type为application/json的请求直接访问API文件 RewriteCond %{REQUEST_METHOD} POST RewriteCond %{CONTENT_TYPE} application/json RewriteRule ^your-api-file\.php$ - [L]把
your-api-file.php替换成你的实际接口文件名,这条规则会让符合条件的请求跳过后续Rewrite规则,直接访问文件。排查ModSecurity安全模块拦截
大多数Linux虚拟主机都启用了ModSecurity,它可能会误判application/json类型的POST请求为恶意操作(比如触发SQL注入防护规则),直接返回404。可以通过以下方式临时验证:
在.htaccess中添加代码,关闭该接口文件的ModSecurity:<Files "your-api-file.php"> SecFilterEngine Off </Files>测试请求是否正常,如果正常,再联系主机服务商查询具体触发的规则ID,针对性关闭即可,避免全局关闭影响安全性。
查看服务器错误日志
虚拟主机后台一般会提供错误日志入口(比如Apache的error_log),找到404错误发生时间点的日志记录,里面会明确标注错误原因——是Rewrite规则拦截、ModSecurity触发,还是其他服务器配置问题,能帮你快速定位根源。确认PHP配置与版本
虽然本地和虚拟主机的PHP版本差异很少导致404,但可以检查虚拟主机的php.ini配置:- 确认
post_max_size和upload_max_filesize足够容纳你的JSON数据(不过这个通常会返回413错误,而非404) - 确认
allow_url_fopen处于开启状态(php://input依赖此配置)
- 确认
内容的提问来源于stack exchange,提问作者NXC CONTROLS

