最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Request.UserHostAddress記錄IP地址問題(內網IP)

 更新時間:2023年10月26日 13:05:17   投稿:mdxy-dxy  
今天遷移至阿里云后,出現了一個問題,有些站點記錄的訪問者IP全是阿里云的兩個內網IP,而程序中是通過Request.UserHostAddress讀取IP地址的,之前從沒遇到過這個問題,很是奇怪

今天遷移至阿里云后,出現了一個問題,有些站點記錄的訪問者IP全是阿里云的兩個內網IP,在程序中是通過Request.UserHostAddress讀取IP地址的,之前從沒遇到過這個問題,很是奇怪。經過分析比較發(fā)現,出現這些問題的站點都是跑在使用了負載均衡的Web服務器上(使用負載均衡,也是這次遷移在性能上的一處提升),這個問題應該與負載均衡有關。

今天遷移至阿里云后,出現了一個問題,有些站點記錄的訪問者IP全是阿里云的兩個內網IP,而程序中是通過Request.UserHostAddress讀取IP地址的,之前從沒遇到過這個問題,很是奇怪。經過分析比較發(fā)現,出現這些問題的站點都是跑在使用了負載均衡的Web服務器上(使用負載均衡,也是這次遷移在性能上的一處提升),這個問題應該與負載均衡有關。

于是,上阿里云網站的管理控制臺查看了一下負載均衡的相應設置,發(fā)現了線索,見下圖:

原來負載均衡器在向Web服務器轉發(fā)請求時,將真實IP存儲在服務器變量X-Forwarded-For中,而Web服務器中執(zhí)行的Request.UserHostAddress實際是從服務器變量REMOTE_ADDR中獲取IP地址的值,由于收到的請求是負載均衡器轉發(fā)過來的,所以REMOTE_ADDR中存儲的是負載均衡器的IP。要解決這個問題,需要改為通過Request.ServerVariables["HTTP_X_FORWARDED_FOR"]讀取。當知道這個原因時,條件反射地就想馬上動手——將代碼中的Request.UserHostAddress改為Request.ServerVariables["HTTP_X_FORWARDED_FOR"]。但是,準備動手時,有些猶豫了,要改的地方不少。。。開始是沖動占上風,這時懶惰開始向沖動發(fā)起進攻。

最終懶惰戰(zhàn)勝了沖動,冷靜下來思考有沒有更好的解決方法。很快就想到了,這個場景正是HTTP Module可以用武的地方,只要在HTTP Module中把ServerVariables["REMOTE_ADDR"]的值改為ServerVariables["HTTP_X_FORWARDED_FOR"]的值,不用改一行代碼,Request.UserHostAddress就能獲取到正確的IP。的確是一個更好的解決方法,于是問題變成了怎么寫這樣的HTTP Module?

懶惰繼續(xù)占著上風,去網上找找有沒有現成的HTTP Module,還真有(X-Forwarded-For HTTP Module For IIS7),而且是鼎鼎大名的F5負載均衡器的生產廠商 F5 Networks, Inc. 的開發(fā)人員開發(fā)的,名叫F5XFFHttpModule,2009年發(fā)布的,基于ISAPI(非托管的)。原以為通過它就能解決問題,而殘酷的現實是這個HTTP Module在我們的IIS上怎么也加載不了,而且會引起整個站點無法正常訪問。又繼續(xù)找,網上多數提到的還是這個HTTP Module,沒找到更好的。

找現成的HTTP Module的懶惰想法沒能成行,但懶惰依然癡心不改,冒出了一個更加懶惰的想法——是不是可以不用另外安裝專門的HTTP Module,用現有的Url Rewrite Module來解決這個問題呢(Web服務器已經安裝有這個Module)?借助Url Rewrite Module修改ServerVariables["REMOTE_ADDR"]的值。根據這個懶惰的想法竟然很快在網上找到一篇博文——如何讓在Reverse Proxy 之後的網站正常運行(URL Rewrite),根據這篇博文成功地以懶惰的方式解決了問題。

下面是具體的操作步驟:

1. 如果IIS上沒有安裝Url Rewrite Module,安裝它(下載地址);

2. 在IIS根節(jié)點或某個站點中打開Url Rewrite Module;

3. 在右側的Actions中點擊View Server Variables...

4. 點擊Add,添加名為REMOTE_ADDR的服務器變量

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

這條規(guī)則的作用就是將每個請求中ServerVariables["REMOTE_ADDR"]的值替換為ServerVariables["HTTP_X_FORWARDED_FOR"] 的值。

applicationHost.config中的對應配置如下:

<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>

移花接木,借花獻佛,這就是我們找到的解決這個問題的最簡單的方法。

【注意事項】

添加該URL重寫規(guī)則會造成IIS內核模式緩存不工作,詳見微軟的坑:Url重寫竟然會引起IIS內核模式緩存不工作

相關文章

最新評論

临江市| 沐川县| 永康市| 宝鸡市| 林州市| 台北县| 元谋县| 乌兰察布市| 高邮市| 伽师县| 平顶山市| 綦江县| 诸城市| 河曲县| 科技| 琼中| 兴业县| 清苑县| 泰安市| 类乌齐县| 怀化市| 遵化市| 商城县| 临洮县| 温州市| 无极县| 八宿县| 博湖县| 龙州县| 泾川县| 东港市| 兴隆县| 峨山| 三河市| 永济市| 双柏县| 榆社县| 栖霞市| 上杭县| 河东区| 石渠县|