給定目標URI,如何以編程方式確定該URI的HTTP GET是否會向本地計算機發出請求?如何以編程方式確定URI,主機名或IP地址是否屬於本地主機?
上下文:我需要這樣做有兩個原因。一個是我有一個mod_perl2應用程序來響應HTTP請求。這樣做時,它有時需要發出HTTP請求來從目標URI檢索一些數據。爲了避免HTTP請求的無限遞歸,如果目標URI實際上會解析到當前機器,我需要避免發出HTTP請求。這是爲了防止用戶意外地在腳下自己拍攝。它不是作爲安全檢查。
第二個原因是,如果我的應用程序收到一個HTTP請求,我需要使用請求URI作爲關鍵字來查找一些元數據。問題是任何一個URI同義詞都可能被用作創建元數據的關鍵字,所以我需要一種方法來解析同義詞,但僅限於本地主機上的URI。
問題不像看URI那樣簡單,看域名是「本地主機」,還是其IP地址是127.0.0.1(或127.0.1.1或127. *),因爲:(a)目標URI可能使用解析爲當前機器上IP地址的完全限定域名(例如,foo.example.com);和(b)一臺機器可以有多個IP地址。
操作系統必須有有必要的信息來弄清楚,因爲它必須知道它偵聽的IP地址和端口。 This post討論試圖確定本地計算機的IP地址(或地址,因爲它可能有幾個)的問題。也許我可以這樣做來確定本地計算機的IP地址,然後或許我可以將這些IP地址與目標URI中的IP地址(或由URI的域的gethostbyname返回的IP地址)進行比較。我真的需要那樣做嗎?這種方法有問題嗎?有沒有更好的辦法?
This post指示C#有一個函數HttpContext.Current.Request.IsLocal來做我所需要的,但我一直無法在perl中找到類似的東西。
我之前在perlmonks.org上使用asked this question(因爲我使用的是perl),但沒有找到滿意的答案。如果有一種解決方案可用於Linux等常用的其他編程語言,例如C,bash或python,那麼這樣做也足夠了。我不需要一種可以保證在任何情況下都能正常工作的解決方案,但是如果它適用於大多數情況,那將會很好。
它也可以指向的IP地址負載均衡器將重寫數據包以指向本地機器。 – derobert
第一種情況的隨機建議:在您的應用生成的請求中,設置一些自定義HTTP標頭。收到請求時檢查它,如果存在,則返回錯誤。請記住,您可以根據需要在自定義標題中放置儘可能多的跟蹤信息(例如,請求所經歷的所有節點 - 如果node2獲得node1請求,則會發送包含node2和node1的標頭; Node3應該是OK ,但節點1或節點2會說「否」) – derobert
將包含唯一字符串(例如系統主機ID或CPUID的md5散列)的註釋添加到/robots.txt。通過http檢索並將其與本地文件系統中的robots.txt進行比較。 –