2014-02-20 62 views
0

我有一个PHP脚本作为cron任务从我们服务器的非公开访问目录运行。该脚本将cURL POSTs发送到可公开访问的URL。为什么file_get_contents()和cURL POST有两个不同的原始IP地址?

我使用.htaccess文件设置了接收URL,该文件拒绝除我允许的IP地址以外的任何IP地址访问。我运行了一个PHP脚本,通过电子邮件将file_get_contents("http://www.whatismyipaddress.com");的输出发送到我的服务器的起始IP地址(这是一个专用服务器,所以我不希望它会改变)。这是我在.htaccess文件中允许的IP。

但是当我通过SSH提示运行脚本时,所有的POST都返回了403 Forbidden错误。当我注释掉.htaccess保护时,POST成功了。

然后我看了看自己的日志文件,结果发现邮件来自与我的file_get_contents()报告不同的IP。将该IP添加到修复问题的.htaccess文件很容易。

但我很困惑,为什么有两个不同的起源IP地址。任何人都可以谈谈这个问题吗?

回答

1

首先,这是一个奇怪的方式来找出您的服务器的IP地址。试过这些?

PHP how to get local IP of system

二:你知道如果服务器是一个其他的防火墙/ NAT表或者一些有关将流量重定向的背后?可能是通过网络服务器从您的服务器传出流量是允许的,但是当通过命令行(不同的PHP进程)调用流量时,会通过代理传递另一条路由,以便您在目标服务器中拥有2个不同的IP地址。

编辑:澄清一些

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 

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

+0

不知道防火墙/ NAT,但我认为这是可能的。我不知道其他获取原始IP的方法,这些方法听起来也不错。当以cron运行时通过命令提示符运行时也不能确定脚本的不同IP。在看到cron失败后,我通过命令提示符完成了所有测试。我在脚本中同时拥有了file_get_contents()和cURL,并且(事实证明)他们不同意。所以这可能是正确的,但我不认为这是我看到的不同IP的原因。 –

+0

更新了我的答案,请尝试。 – ntaso

+0

此外,它看起来像你链接的问题中的大多数方法是获取内部网络IP,这是不同于服务器的原始IP地址。 –

相关问题