Red Hat AWS Apache环境下PHP CURL命令行正常但浏览器访问返回http_code=0如何解决
问题原因及解决方案
该问题核心是PHP CLI模式(SSH执行)和Apache运行的PHP模式的运行环境、权限差异导致的,可按照以下优先级排查调整:
1. 优先排查SELinux限制(Red Hat系系统最高发原因)
Red Hat默认开启SELinux安全模块,Apache进程默认没有对外发起网络连接的权限,这是SSH执行正常、网页访问失败最常见的诱因:
- 执行以下命令查看SELinux的HTTP连接权限配置:
getsebool httpd_can_network_connect
如果返回结果为httpd_can_network_connect --> off即可确认是该问题 - 临时开启权限验证:
setsebool httpd_can_network_connect on
配置后刷新网页测试是否恢复正常 - 验证生效后执行以下命令永久保留配置:
setsebool -P httpd_can_network_connect on
2. 检查环境变量差异
SSH登录用户的shell环境可能配置了HTTP/HTTPS代理,而Apache的运行环境默认不会继承这些代理配置:
- 在现有PHP脚本中加入以下代码,分别在SSH和网页访问时对比输出:
var_dump(getenv('http_proxy'), getenv('https_proxy'));
- 如果SSH有代理配置、网页访问没有,要么在curl代码中主动加代理配置:
curl_setopt($ch, CURLOPT_PROXY, '你的代理地址:端口');
要么在Apache的配置文件中加入对应代理环境变量的传递配置。
3. 检查防火墙与AWS安全组规则
- 确认服务器本地firewalld是否限制了Apache运行用户的出站流量,可临时关闭防火墙验证:
systemctl stop firewalld
如果恢复正常,新增出站规则允许80、443端口的TCP流量即可。 - 确认AWS实例绑定的安全组出站规则允许访问目标站点
testsite.com对应的80/443端口。
4. 检查PHP配置差异
分别在SSH执行php -i和网页输出phpinfo(),对比以下配置:
- curl扩展是否均为启用状态
open_basedir配置是否存在差异,是否限制了网络相关调用disable_functions中是否禁用了curl相关函数
辅助排查方案
如果以上配置都正常,可以在curl代码中开启调试日志定位具体错误:
$debugLog = fopen('/tmp/curl_debug.log', 'w+'); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_STDERR, $debugLog);
运行脚本后查看/tmp/curl_debug.log的内容即可定位具体失败原因。
内容的提问来源于stack exchange,提问作者Tom Kincaid
相关产品推荐
相关产品推荐

