Request.UserHostAddress記錄IP地址問(wèn)題(內(nèi)網(wǎng)IP)
今天遷移至阿里云后,出現(xiàn)了一個(gè)問(wèn)題,有些站點(diǎn)記錄的訪問(wèn)者IP全是阿里云的兩個(gè)內(nèi)網(wǎng)IP,在程序中是通過(guò)Request.UserHostAddress讀取IP地址的,之前從沒(méi)遇到過(guò)這個(gè)問(wèn)題,很是奇怪。經(jīng)過(guò)分析比較發(fā)現(xiàn),出現(xiàn)這些問(wèn)題的站點(diǎn)都是跑在使用了負(fù)載均衡的Web服務(wù)器上(使用負(fù)載均衡,也是這次遷移在性能上的一處提升),這個(gè)問(wèn)題應(yīng)該與負(fù)載均衡有關(guān)。
今天遷移至阿里云后,出現(xiàn)了一個(gè)問(wèn)題,有些站點(diǎn)記錄的訪問(wèn)者IP全是阿里云的兩個(gè)內(nèi)網(wǎng)IP,而程序中是通過(guò)Request.UserHostAddress讀取IP地址的,之前從沒(méi)遇到過(guò)這個(gè)問(wèn)題,很是奇怪。經(jīng)過(guò)分析比較發(fā)現(xiàn),出現(xiàn)這些問(wèn)題的站點(diǎn)都是跑在使用了負(fù)載均衡的Web服務(wù)器上(使用負(fù)載均衡,也是這次遷移在性能上的一處提升),這個(gè)問(wèn)題應(yīng)該與負(fù)載均衡有關(guān)。
于是,上阿里云網(wǎng)站的管理控制臺(tái)查看了一下負(fù)載均衡的相應(yīng)設(shè)置,發(fā)現(xiàn)了線索,見(jiàn)下圖:

原來(lái)負(fù)載均衡器在向Web服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求時(shí),將真實(shí)IP存儲(chǔ)在服務(wù)器變量X-Forwarded-For中,而Web服務(wù)器中執(zhí)行的Request.UserHostAddress實(shí)際是從服務(wù)器變量REMOTE_ADDR中獲取IP地址的值,由于收到的請(qǐng)求是負(fù)載均衡器轉(zhuǎn)發(fā)過(guò)來(lái)的,所以REMOTE_ADDR中存儲(chǔ)的是負(fù)載均衡器的IP。要解決這個(gè)問(wèn)題,需要改為通過(guò)Request.ServerVariables["HTTP_X_FORWARDED_FOR"]讀取。當(dāng)知道這個(gè)原因時(shí),條件反射地就想馬上動(dòng)手——將代碼中的Request.UserHostAddress改為Request.ServerVariables["HTTP_X_FORWARDED_FOR"]。但是,準(zhǔn)備動(dòng)手時(shí),有些猶豫了,要改的地方不少。。。開(kāi)始是沖動(dòng)占上風(fēng),這時(shí)懶惰開(kāi)始向沖動(dòng)發(fā)起進(jìn)攻。
最終懶惰戰(zhàn)勝了沖動(dòng),冷靜下來(lái)思考有沒(méi)有更好的解決方法。很快就想到了,這個(gè)場(chǎng)景正是HTTP Module可以用武的地方,只要在HTTP Module中把ServerVariables["REMOTE_ADDR"]的值改為ServerVariables["HTTP_X_FORWARDED_FOR"]的值,不用改一行代碼,Request.UserHostAddress就能獲取到正確的IP。的確是一個(gè)更好的解決方法,于是問(wèn)題變成了怎么寫(xiě)這樣的HTTP Module?
懶惰繼續(xù)占著上風(fēng),去網(wǎng)上找找有沒(méi)有現(xiàn)成的HTTP Module,還真有(X-Forwarded-For HTTP Module For IIS7),而且是鼎鼎大名的F5負(fù)載均衡器的生產(chǎn)廠商 F5 Networks, Inc. 的開(kāi)發(fā)人員開(kāi)發(fā)的,名叫F5XFFHttpModule,2009年發(fā)布的,基于ISAPI(非托管的)。原以為通過(guò)它就能解決問(wèn)題,而殘酷的現(xiàn)實(shí)是這個(gè)HTTP Module在我們的IIS上怎么也加載不了,而且會(huì)引起整個(gè)站點(diǎn)無(wú)法正常訪問(wèn)。又繼續(xù)找,網(wǎng)上多數(shù)提到的還是這個(gè)HTTP Module,沒(méi)找到更好的。
找現(xiàn)成的HTTP Module的懶惰想法沒(méi)能成行,但懶惰依然癡心不改,冒出了一個(gè)更加懶惰的想法——是不是可以不用另外安裝專門的HTTP Module,用現(xiàn)有的Url Rewrite Module來(lái)解決這個(gè)問(wèn)題呢(Web服務(wù)器已經(jīng)安裝有這個(gè)Module)?借助Url Rewrite Module修改ServerVariables["REMOTE_ADDR"]的值。根據(jù)這個(gè)懶惰的想法竟然很快在網(wǎng)上找到一篇博文——如何讓在Reverse Proxy 之後的網(wǎng)站正常運(yùn)行(URL Rewrite),根據(jù)這篇博文成功地以懶惰的方式解決了問(wèn)題。
下面是具體的操作步驟:
1. 如果IIS上沒(méi)有安裝Url Rewrite Module,安裝它(下載地址);
2. 在IIS根節(jié)點(diǎn)或某個(gè)站點(diǎn)中打開(kāi)Url Rewrite Module;
3. 在右側(cè)的Actions中點(diǎn)擊View Server Variables...

4. 點(diǎn)擊Add,添加名為REMOTE_ADDR的服務(wù)器變量

5. Back to Rules,添加一條下圖所示的規(guī)則

這條規(guī)則的作用就是將每個(gè)請(qǐng)求中ServerVariables["REMOTE_ADDR"]的值替換為ServerVariables["HTTP_X_FORWARDED_FOR"] 的值。
applicationHost.config中的對(duì)應(yīng)配置如下:
<rewrite>
<allowedServerVariables>
<add name="REMOTE_ADDR" />
</allowedServerVariables>
<globalRules>
<rule name="HTTP_X_Forwarded_For-to-REMOTE_ADDR" enabled="true">
<match url=".*" />
<serverVariables>
<set name="REMOTE_ADDR" value="{HTTP_X_Forwarded_For}" />
</serverVariables>
<action type="None" />
<conditions>
<add input="{HTTP_X_Forwarded_For}" pattern="^$" negate="true" />
</conditions>
</rule>
</globalRules>
</rewrite>移花接木,借花獻(xiàn)佛,這就是我們找到的解決這個(gè)問(wèn)題的最簡(jiǎn)單的方法。
【注意事項(xiàng)】
添加該URL重寫(xiě)規(guī)則會(huì)造成IIS內(nèi)核模式緩存不工作,詳見(jiàn)微軟的坑:Url重寫(xiě)竟然會(huì)引起IIS內(nèi)核模式緩存不工作。
相關(guān)文章
Windows7 apache啟動(dòng)失敗的解決方法
Windows7啟動(dòng)apache失敗了,大家可以參考下下面的方法,看看。2009-07-07
windows server 2016部署服務(wù)的方法步驟(圖文教程)
這篇文章主要介紹了windows server 2016部署服務(wù)的方法步驟(圖文教程),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
IIS啟動(dòng)失敗"系統(tǒng)找不到指定的路徑"的解決
--------------------------- 錯(cuò)誤 --------------------------- 系統(tǒng)找不到指定的路徑。 --------------------------- 確定 ---------------------------2008-07-07
windows 2008 裝iis很簡(jiǎn)單 asp的
首先服務(wù)器里面要開(kāi)啟Windows Modules Installer和Software Licensing哦~~ 這個(gè)是Windows 更新和可選組件的安裝……如果關(guān)閉的話 那就沒(méi)辦法安裝組件了~2008-07-07
IIS PHP環(huán)境Temp文件夾的權(quán)限問(wèn)題引起的網(wǎng)站故障
服務(wù)器非常慢,把WINDOWS2003重啟了,結(jié)果連不上服務(wù)器。結(jié)果悲劇的去了機(jī)房2013-02-02

