为何XAMPP放入含cURL POST代码的PHP文件后Apache无法读取目录
问题描述
XAMPP环境运行状态正常,localhost路径下其余所有目录均可正常访问。但将下述cURL测试PHP文件放入目标目录后,浏览器直接返回Object not found错误,且触发问题时该PHP文件所在的整个目录都无法被Apache解析访问,并非单个文件访问异常。
<?php $data = array ( 'number' => 1, 'current_date' => date('Y-m-d'), 'name' => 'RS' ); $ch = curl_init(); $options = array( CURLOPT_URL => 'http://localhost/fake_api/', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $data, CURLOPT_RETURNTRANSFER => 1, ); curl_setopt_array($ch, $options); $result = curl_exec($ch); curl_close($ch); print_r($result); ?>
目前处于本地自学cURL POST请求编写阶段,后续需要在生产服务器向线上API发起POST请求,该问题导致测试流程无法推进。
已单独部署存放fake_api接口的PHP文件目录,Apache可正常识别该路径,直接通过浏览器访问http://localhost/fake_api/时可正常返回array()结果。
排查与解决步骤
该问题和你写的cURL逻辑本身无关,是Apache目录级访问规则异常导致的,按以下顺序排查即可:
- 检查目标目录下是否存在
.htaccess文件
XAMPP默认开启了目录级配置覆写权限,部分编辑器、安全防护工具会在检测到目录内存在向外发起POST请求的PHP代码时,自动生成包含错误重写规则的.htaccess文件,只要该文件存在,整个目录的所有请求都会被转发到不存在的路径,直接触发404。开启系统隐藏文件可见后找到该文件直接删除,即可恢复目录访问。 - 校验Apache虚拟主机配置
如果删除.htaccess后问题依旧,打开XAMPP的Apache虚拟主机配置文件,找到目标目录对应的<Directory>配置段,确认没有配置错误的RewriteRule跳转规则、没有设置错误的目录访问权限,修改完成后重启Apache服务即可。 - 检查mod_security规则拦截
如果开启了Apache的mod_security模块,部分默认的WAF规则会拦截目录内包含cURL外发POST请求特征的访问请求,临时关闭对应规则后重试即可。
额外提示:你当前代码中直接给
CURLOPT_POSTFIELDS传入PHP数组,cURL会自动将请求编码为multipart/form-data格式,如果后续对接的线上API要求application/x-www-form-urlencoded格式,需要将传入的数组通过http_build_query()处理后再赋值给该参数。
内容的提问来源于stack exchange,提问作者Yenmangu
相关产品推荐
相关产品推荐

