php cURL 到 localhost 返回在开放端口上被拒绝的权限

Posted

技术标签:

【中文标题】php cURL 到 localhost 返回在开放端口上被拒绝的权限【英文标题】:php cURL to localhost returns permission denied on an open port 【发布时间】:2018-03-22 04:12:45 【问题描述】:

我在尝试使用 php cURL 库向 localhost 的 4321 端口发出 cURL 请求时遇到权限被拒绝错误。希望这对于以前遇到此问题的人来说非常容易或明显。

我能够从局域网上的另一个系统向生产服务器发出相同的 cURL 请求。例如,如果在局域网上的另一个系统上,我使用下面的函数$host='http://192.168.1.100:4321' 发出请求,那么一切都完全正常。如果我在 $host='http://localhost:4321'$host='http://127.0.0.1:4321'$host='::1:4321' 的系统本身上运行,则会收到“权限被拒绝”的 cURL 错误

我为我非常简单的请求编写的函数是:

function makeRequest($host,$data)
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL, $host);
    curl_setopt($ch,CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = json_decode(curl_exec($ch),true);
    if(!empty(curl_error($ch)))
        $result = print_r(curl_error($ch).' - '.$host);
    
    curl_close($ch);
    return $result;

系统是一个centos 7服务器。运行firewall-cmd --list-all 显示我的开放端口

ports: 443/tcp 80/tcp 4321/tcp

如果您有任何想法,或者需要我检查设置,请随时询问。

编辑 主机文件看起来像

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

EDIT2

当我对同一个端口使用命令行 curl 时,一切都会恢复正常。

 /]$ curl -v localhost:4321
* About to connect() to localhost port 4321 (#0)
*   Trying ::1...
* Connected to localhost (::1) port 4321 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:4321
> Accept: */*
>
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: no-cache, no-store, must-revalidate
< Content-Length: 774....

【问题讨论】:

一些建议是 1) 检查您的 hosts 文件并查看 localhost 是否映射到 127.0.0.1,如果没有,则添加此条目,以及 2) 运行 @ 987654333@ 从命令行使用-v 开关检查完整输出并获得更好的洞察力。如果您在命令行上运行 curl,请考虑在此处转储输出,以便我们查看发生了什么。 注意到您的第一次(成功)尝试前面有http://,而失败的则没有。那是错字吗? cURL 需要对 http(s) 进行操作 有点错别字。我先尝试了http://,后来又没有了。 您能告诉我们您遇到的确切错误吗?这有助于缩小问题范围。 那么,谁在监听那个端口?某种http服务器?如果您确实获得了被拒绝的权限(即不是连接被拒绝),那么问题可能出在侦听过程中。 【参考方案1】:

我在以下位置找到了问题的答案: Getting permission denied while Posting xml using Curl?

问题是SELinux,解决方法是运行:

sudo setsebool httpd_can_network_connect 1

我可以使用 php cURL 库访问世界上所有其他网站,但不能使用不同端口上的 localhost,而我能够从命令行 cURL 访问 localhost,这对我来说没有任何意义。

【讨论】:

使用这个user@host /]$ sudo setsebool httpd_can_network_connect 1 从上面的语法中删除=。这对我有用。

以上是关于php cURL 到 localhost 返回在开放端口上被拒绝的权限的主要内容,如果未能解决你的问题,请参考以下文章

php curl采集,服务器gzip压缩返回数据怎么办

php curl采集,服务器gzip压缩返回数据怎么办

php curl采集,服务器gzip压缩返回数据怎么办

php curl采集,服务器gzip压缩返回数据怎么办

php curl采集,服务器gzip压缩返回数据怎么办

PHP CURL上传文件