You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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/tcpsudo ufw allow 443/tcp,再开启防火墙sudo ufw enable
  • 检查iptables规则:sudo iptables -L,看看INPUT链里有没有拒绝80端口的规则,有的话删掉或者添加允许规则

4. 检查Apache虚拟主机配置

如果配置了虚拟主机,直接用IP访问可能触发400错误——因为Apache找不到匹配的主机名:

  • 打开虚拟主机配置文件(一般在/etc/apache2/sites-available/下),比如你的配置是这样:
    <VirtualHost *:80>
        ServerName example.com
        DocumentRoot /var/www/html
        # 其他配置...
    </VirtualHost>
    
    那直接用IP访问就会失败,你可以给这个虚拟主机加个IP别名:
    ServerAlias 你的服务器IP
    
    修改后重启Apache:sudo 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

火山引擎 最新活动