【问题标题】:Why would a file_get_contents() and a cURL POST have two different origin IP addresses?为什么 file_get_contents() 和 cURL POST 会有两个不同的源 IP 地址?
【发布时间】:2014-03-21 12:53:07
【问题描述】:

我有一个 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 地址感到困惑。任何人都可以对这个主题有所了解吗?

【问题讨论】:

    标签: php apache .htaccess curl


    【解决方案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
    

    比较输出。都一样吗?

    【讨论】:

    • 不确定防火墙/NAT,但我认为这样的事情是可能的。我不知道其他获取原始IP的方法,这些听起来也不错。当作为 cron 运行与通过命令提示符运行时,也不确定脚本的不同 IP。在看到 cron 失败后,我通过命令提示符进行了所有测试。我在脚本中同时拥有 file_get_contents() 和 cURL,并且(事实证明)它们彼此不同意。所以这可能是正确的,但我认为这不是我看到的不同 IP 的原因。
    • 更新了我的答案,请尝试一下。
    • 另外,您链接的问题中的大多数方法似乎都是用于获取内部网络 IP,这与服务器的原始 IP 地址不同。
    • 好的,现在我们到了某个地方!从浏览器运行 i.php 时,我得到(如预期的那样)我自己计算机的 IP。通过命令提示符运行 PHP 脚本时,我得到了在日志文件中找到的地址。通过命令提示符运行 cURL 时,我也得到了该地址。所以实际上 file_get_contents() 和 cURL 是一致的。然后我更新了脚本以执行 whatismyipaddress.com 的 file_get_contents() 以及我的测试脚本。 whatismyipaddress.com 返回不同的 IP。看起来到外部地址的流量与内部地址的源 IP 不同!
    • 是的,似乎一些传出流量是通过代理路由的。 $_SERVER['SERVER_ADDR'] 应该得到自己服务器的 IP 地址。但是,这可能与您的公共服务器记录的不同。取决于私人服务器的配置和网络环境。在您的 htaccess 文件中,您可以添加来自 $_SERVER 的地址以及从 shell 运行脚本获得的地址。
    猜你喜欢
    • 1970-01-01
    • 2014-10-08
    • 2022-01-24
    • 2012-02-26
    • 2017-09-28
    • 2011-11-27
    • 2015-10-08
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多