使用IP地址调用file_get_contents报400错误及CURL无路由问题求助
解决file_get_contents 400 Bad Request与CURL NO ROUTE问题
看起来咱们的服务器对外网络是正常的(能访问google),问题肯定出在本地配置、请求格式或者内部路由上,咱们一步步来排查:
1. 先确认file_get_contents的请求格式是否正确
400错误绝大多数是请求格式不对——你是不是直接写了IP没加http:///https://?比如:
// 错误示例:没加协议,PHP会把它当成本地文件路径 file_get_contents('192.168.1.100'); // 正确写法:必须带上协议头 file_get_contents('http://192.168.1.100');
尤其是访问本地Apache的时候,协议头不能少,不然PHP根本不会发起HTTP请求。
2. 验证Apache是否监听了正确的IP和端口
默认Apache会监听所有IP的80端口,但有时候配置可能被修改:
- 执行命令查看监听状态:
sudo apache2ctl -S,看输出里的VirtualHost是不是绑定了*:80(所有IP),或者你要访问的具体IP - 在服务器本地测试访问:
curl http://localhost或者curl http://你的服务器IP,如果本地curl都失败,那要么Apache没正常启动,要么端口被拦截了
3. 排查防火墙/iptables规则
CURL的NO ROUTE错误很可能是防火墙把请求拦了:
- 先临时关闭防火墙测试:
sudo ufw disable,然后再试curl和file_get_contents,如果能访问了,就说明是防火墙的问题。之后记得重新添加允许规则:sudo ufw allow 80/tcp、sudo ufw allow 443/tcp,再开启防火墙sudo ufw enable - 检查iptables规则:
sudo iptables -L,看看INPUT链里有没有拒绝80端口的规则,有的话删掉或者添加允许规则
4. 检查Apache虚拟主机配置
如果配置了虚拟主机,直接用IP访问可能触发400错误——因为Apache找不到匹配的主机名:
- 打开虚拟主机配置文件(一般在
/etc/apache2/sites-available/下),比如你的配置是这样:
那直接用IP访问就会失败,你可以给这个虚拟主机加个IP别名:<VirtualHost *:80> ServerName example.com DocumentRoot /var/www/html # 其他配置... </VirtualHost>
修改后重启Apache:ServerAlias 你的服务器IPsudo systemctl restart apache2
5. 确认PHP的allow_url_fopen配置
虽然你能访问google说明这个配置大概率是开着的,但还是确认下:
- 执行
php -i | grep allow_url_fopen,输出要是On才对。如果是Off,找到php.ini文件(CLI和Apache的都要改,路径一般是/etc/php/版本/cli/php.ini和/etc/php/版本/apache2/php.ini),把allow_url_fopen = Off改成On,然后重启Apache。
6. 排查网络路由问题(针对CURL NO ROUTE)
如果本地curl访问IP还是报NO ROUTE,可能是服务器路由表有问题:
- 查看路由表:
ip route show,确认有默认路由,且目标IP段的路由存在 - 如果访问的是本地IP(比如127.0.0.1或内网IP),检查lo网卡状态:
ip addr show lo,确保它是up状态,要是没启动就执行sudo ip link set lo up
先从这些步骤入手,一般前几个就能解决问题。如果还是不行,可以把curl -v http://你的IP的详细输出贴出来,能帮你更精准定位。
内容的提问来源于stack exchange,提问作者Ankita Kashyap




