apache 为什么file_get_contents()和cURL POST有两个不同的源IP地址?

sc4hvdpw  于 2023-10-23  发布在  Apache
关注(0)|答案(1)|浏览(159)

我有一个PHP脚本,作为cron任务从我们服务器的非公开访问目录运行。该脚本将cURL POST发送到可公开访问的URL。
我用一个.htaccess文件设置了接收URL,该文件拒绝来自除我允许的IP地址之外的任何IP地址的访问。我运行了一个PHP脚本,它通过电子邮件向我发送了一个file_get_contents("http://www.whatismyipaddress.com");的输出,以获取我的服务器的原始IP地址(这是一个专用服务器,所以我不希望它改变)。这是我在.htaccess文件中允许的IP地址。
但是当我通过SSH提示符运行脚本时,所有POST都返回403 Forbidden错误。当我注解掉.htaccess保护时,POST成功了。
然后我查看了我的日志文件,结果发现POST来自与我的file_get_contents()报告的不同的IP。很容易将该IP添加到.htaccess文件中,这解决了问题。
但我很困惑,为什么有两个不同的起源IP地址。有人能解释一下这个问题吗?

ahy6op9u

ahy6op9u1#

首先,这是一个奇怪的方式来找出您的服务器的IP地址。试过这个吗
PHP how to get local IP of system
第二:你知道服务器是否在防火墙/NAT或其他重定向流量的东西后面吗?可能是允许通过Web服务器从服务器传出流量,但从命令行(不同的PHP进程)调用时,流量会通过代理进行另一条路由,因此您最终会在目标服务器中使用2个不同的IP地址。
编辑:澄清了一些事情
编辑2:试试这个:
在可公开访问的服务器上,使用以下内容设置脚本i.php

<?php die($_SERVER['REMOTE_ADDR']); ?>

然后,在运行cron的私有服务器上,编写一个这样的脚本:

<?php echo file_get_contents("http://publicserver.com/i.php"); ?>

从你的浏览器运行它。然后通过SSH从shell运行它。然后,通过SSH,执行以下命令:

curl http://publicserver.com/i.php

比较输出。都一样吗

相关问题