2014-02-20 114 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地址。 –

相關問題