1

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

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

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

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

编辑2

当我对同一个端口使用命令行 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....
4

1 回答 1

14

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

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

sudo setsebool httpd_can_network_connect 1

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

于 2017-10-11T01:22:00.153 回答