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

时间:2014-02-20 14:06:47

标签: php apache .htaccess curl

我有一个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。将该IP添加到.htaccess文件很容易,这解决了问题。

但我很困惑为什么有两个不同的原始IP地址。任何人都可以对这个问题有所了解吗?

1 个答案:

答案 0 :(得分:1)

首先,这是查找服务器IP地址的奇怪方法。试过这些?

PHP how to get local IP of system

第二:你知道服务器是否在防火墙/ NAT之后或其他重定向流量的东西吗?可能是允许通过Web服务器从您的服务器传出流量,但是从命令行调用流量(不同的PHP进程)通过代理进入另一条路径,这样您最终会在目标服务器中使用2个不同的IP地址。 / p>

编辑:澄清了一些事情

Edit2:试试这个:

在可公开访问的服务器上,设置包含以下内容的脚本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

比较输出。一切都一样吗?