PHP file_get_contents()和curl_exec()在网站上失败,但在命令行中可以工作



用一行代码创建了.test.php文件:

<?php
var_dump(file_get_contents('https://checkip.amazonaws.com'));
?>

当我从浏览器打开.test.php时,它显示bool(false(,但当我从命令行运行它时,它会按预期显示我的WAN IP。

php -f .test.php

我使用的是Centos9、nginx 1.20.1和PHP 8.1.3(尽管我也尝试过RHEL8和Apache(

我尝试设置/etc/php fpm.d/www.conf来使用我的用户ID和组,以确保这不是权限问题。

phpinfo((显示allow_url_fopen设置为On,curl 7.76.1已启用,OpenSSL已启用3.0.1版本

我还尝试了使用http:URL

我还尝试在.php文件中使用curl((库,但这些库以相同的方式失败。

如果调用php-v或其他.php文件,则从.php文件调用exec((有效,但如果调用
curl则无效

不知道还能尝试什么,所以我可能会再次对整个服务器进行核攻击。

更新:在/var/log/nginx/error.log中发现此错误FastCGI sent in stderr: "PHP message: PHP Warning: file_get_contents(https://checkip.amazonaws.com): Failed to open stream: Permission denied

现在怎么办?

命令行解释器/接口CLI和公共网关接口CGI中可能使用不同的PHP环境设置。

首先比较两种环境中加载的.ini文件,即

  1. 对于CLI运行php -i
  2. 对于CCD_ 7,创建仅具有内容CCD_ 9的文件CCD_

比较结果,查看加载了哪些modules和/或加载了哪些.ini文件。

找到错误日志后,我就能找到答案。这是一个Linux权限设置,运行以下命令修复了它:setsebool -P httpd_can_network_connect on

最新更新