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

发布于 2025-01-10 04:55:07 字数 950 浏览 0 评论 0原文

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

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

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

php -f .test.php

我正在使用 CentOS 9、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,并且在版本 3.0.1 中启用了 OpenSSL

我也尝试过使用 http: URL

我也尝试过使用 curl .php 文件中的 () 库和这些库以相同的方式失败。

如果从 .php 文件调用 php -v 或另一个 .php 文件,则从 .php 文件调用 exec() 有效,但如果调用 curl 则无效

不确定是什么否则要尝试,所以我可能会再次对整个服务器进行核攻击。

更新:在 /var/log/nginx/error.log 中找到此内容 FastCGI 在 stderr 中发送:“PHP 消息:PHP 警告:file_get_contents(https://checkip.amazonaws.com): 无法打开流:权限被拒绝

现在怎么办?

Created .test.php file with one line of code:

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

When I open .test.php from browser, it shows bool(false) but when I run it from command line, it shows my WAN IP as expected.

php -f .test.php

I am using CentOS 9, nginx 1.20.1, and PHP 8.1.3 (Although I've also tried RHEL8 and Apache)

I tried setting /etc/php-fpm.d/www.conf to use my userid and group to make sure it was not a permission problem.

phpinfo() shows allow_url_fopen is set to On and that curl 7.76.1 is enabled and that OpenSSL is enabled with version 3.0.1

I also tried with an http: URL

I also tried using curl() libraries in the .php file and those fail in the same manner.

Calling exec() from .php file works if it calls php -v or another .php file but not if it calls curl

Not sure what else to try, so I will probably nuke the whole server again.

UPDATE: Found this in /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

Now what?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独闯女儿国 2025-01-17 04:55:07

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

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

  1. 对于 CLI 运行 php -i
  2. 对于 CGI 创建一个仅包含内容 的文件 phpinfo.php ?php echo phpinfo(); 并在网络浏览器中打开它。

比较结果并查看加载了哪些模块和/或加载了哪些.ini文件。

There might be different settings of your PHP environment used in Command Line Interpreter/Interface CLI vs Common Gateway Interface CGI .

First compare what .ini files are loaded in both environment, ie.

  1. for CLI run php -i
  2. for CGI create a file phpinfo.php with only content <?php echo phpinfo(); and open it in the web browser.

Compare the results and see what modules are loaded and/or what .ini files are loaded.

鸠魁 2025-01-17 04:55:07

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

Once I found the error log, I was able to find my answer. It was a Linux permission setting and running the following command fixed it:
setsebool -P httpd_can_network_connect on

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文