You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Curl代理代码仅命令行可用,浏览器运行报连接拒绝

问题:浏览器运行带代理的PHP Curl脚本失败,命令行正常

我有一个带代理的Curl请求,代码如下:

<?php
$botToken = "";
$chatId = "-1234";
$message = 'Test';
$data = [
    'chat_id' => $chatId,
    'text' => $message,
];
$url = "https://api.telegram.org/bot:token/sendMessage";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_HEADER, "Content-type: application/x-www-form-urlencoded
");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_PROXY, 'example.proxy.com:1716');
curl_setopt($ch, CURLOPT_PROXYPORT, '1716');
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'passwd');
curl_setopt($ch, CURLOPT_POSTFIELDS,($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$result = curl_exec($ch);
if(curl_errno($ch)){
    echo 'Curl error: ' . curl_error($ch);
}else{
    echo "No Error";
}
curl_close($ch);
echo $result;
?>

当我在浏览器中运行这段代码时,无法连接,报错:

Curl error: Failed to connect to example.proxy.com port 1716: Connection refused

但在命令行执行php aaa.php时,代码可正常运行,无任何问题。请问这是什么问题?


问题分析与解决

核心差异点

浏览器运行PHP脚本是通过**Web服务器(Apache/Nginx等)**的系统用户执行,而命令行是用你当前登录的用户执行,两者的网络权限、DNS配置、环境变量完全不同,这是导致问题的根源。

具体原因及解决办法

1. Web服务器用户无网络访问权限

Web服务进程(比如Apache的www-data、Nginx的nginx用户)可能被防火墙、SELinux或AppArmor限制了访问代理服务器的权限。

  • 解决:
    • 检查防火墙规则,允许Web服务器所在机器访问example.proxy.com:1716。
    • 若为SELinux限制,执行sudo setsebool -P httpd_can_network_connect 1(Apache),对应Nginx的命令可根据系统调整布尔值。

2. 代理域名在Web服务器环境无法解析

命令行和Web服务器可能使用不同的DNS配置,导致Web服务器无法解析example.proxy.com。

  • 解决:
    • 切换到Web服务器用户测试DNS解析:sudo -u www-data nslookup example.proxy.com。
    • 若解析失败,修改Web服务器的DNS配置,或直接替换代理域名为IP地址。

3. 代理服务器限制请求来源

代理服务器可能只允许命令行环境的IP访问,拒绝了Web服务器的出口IP(比如Web服务器在容器/虚拟机中,出口IP与命令行不同)。

  • 解决:
    • 检查代理服务器的白名单配置,添加Web服务器的出口IP。
    • 确认Web服务器的网络出口与命令行是否一致(比如是否走了不同网关)。

4. Curl配置冲突

代码中同时设置了CURLOPT_PROXY(带端口)和CURLOPT_PROXYPORT,部分环境下会导致Curl解析错误。

  • 解决:
    • 删除CURLOPT_PROXYPORT的配置,仅保留CURLOPT_PROXY的完整地址:
      curl_setopt($ch, CURLOPT_PROXY, 'example.proxy.com:1716');
      // 移除这一行:curl_setopt($ch, CURLOPT_PROXYPORT, '1716');
      

额外排查步骤

  • 在脚本中添加var_dump(getenv('HTTP_PROXY'), getenv('HTTPS_PROXY'));,查看Web服务器环境是否继承了系统代理变量,可能与手动设置的代理冲突。
  • 用Web服务器用户直接执行脚本:sudo -u www-data php aaa.php,若也报错,说明是用户权限/环境问题;若正常,则排查Web服务器的反向代理或网关配置。

内容的提问来源于stack exchange,提问作者Amin Gholibeigian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:10:59