IIS實現(xiàn)反向代理時Cookie域的設置方法
反向代理
神馬是反向代理?指以代理服務器來接受Internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡上的服務器,并將從服務器上得到的結(jié)果返回給Internet上請求連接的客戶端,此時代理服務器對外就表現(xiàn)為一個服務器。我們可以通過反向代理實現(xiàn)負載平衡、突破防火墻限制等一些非常實用的Web服務器功能,目前反向代理不管在私有云還是公有云的虛擬機上用的很多很多。
引用
IIS通過URL重寫可以實現(xiàn)反向代理,通過簡單的配置即可以將請求轉(zhuǎn)發(fā)到其它內(nèi)部站點。
此時被代理的所有站點的cookie的域(domain)會自動設置為提供反向代理功能的站點的域,這一般來說沒有問題。但是在多站點共享cookie時會存在問題。
比如有一個對外的域名 proxy.fireflysoft.net,這個域名指向一個提供反向代理的站點;然后還有一個域名pay.fireflysoft.net,指向一個獨立的IIS站點,提供支付服務;然后proxy.fireflysoft.net/mall 提供商城服務,用戶在這里下單后支付,需要跳轉(zhuǎn)到pay.fireflysoft.net;
為了在這兩個站點之間實現(xiàn)用戶狀態(tài)共享,這里希望他們之間可以共享SessionID,這個值保存在cookie中,所以實際上是期望共享cookie,共享cookie可以通過設置不同站點cookie的域為相同的值來實現(xiàn)。
比如這里希望proxy.fireflysoft.net和pay.fireflysoft.net的cookie域值都為fireflysoft.net,這樣proxy.fireflysoft.net的用戶狀態(tài)就可以為pay.fireflysoft.net所使用。但是這面臨上邊提到的反向代理站點cookie域自動設置問題。
關(guān)于這個問題,網(wǎng)上可以搜索到的方案大部分都是Nginx的,其實IIS的URL重寫也是支持的,只不過用的人可能比較少,所以查不到什么資料。
這個解決方案是在IIS的論壇上找到的,有人問同樣的問題:https://forums.iis.net/t/1193378.aspx。帖子中并沒有給出直接的答案,而是參考一個使用URL重寫設置cookie HttpOnly的方案:
http://clarify.dovetailsoftware.com/gsherman/2011/01/20/using-the-url-rewrite-module-to-set-your-cookies-to-httponly/
有興趣的可以讀一下原文,下邊將直接給出解決方案。
URL重寫的規(guī)則會保存到web.config中,因為設置cookie屬于URL重寫的出站規(guī)則,所以直接在出站規(guī)則中增加相關(guān)配置:
<rewrite> <outboundRules> <rule name="Add Domain" preCondition="No Domain"> <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" /> <action type="Rewrite" value="{R:0}; domain=fireflysoft.net" /> <conditions> </conditions> </rule> <preConditions> <preCondition name="No Domain"> <add input="{RESPONSE_Set_Cookie}" pattern="." /> <add input="{RESPONSE_Set_Cookie}" pattern="; domain=.*" negate="true" /> </preCondition> </preConditions> </outboundRules> </rewrite>
代碼中包含兩部分:
首先是前提條件preConditions:針對響應時設置cookie,且沒有設置cookie domain的情況;
然后是處理規(guī)則rule:針對響應時設置的cookie,重寫cookie,增加domain的設置。
這樣cookie domain即設置為目標值,從而實現(xiàn)cookie在二級域名之間的共享。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
微信公眾平臺開發(fā)之認證"成為開發(fā)者".Net代碼解析
這篇文章主要為大家詳細解析了微信公眾平臺開發(fā)之認證"成為開發(fā)者".Net代碼,感興趣的小伙伴們可以參考一下2016-06-06CommunityServer又稱CS論壇的相關(guān)學習資料
以前項目需要整合這個論壇,同事找了一些資料,現(xiàn)在放上來,并說下自己對這個論壇的看法。2009-05-05讓GridView只更新某些特定的數(shù)據(jù)的方法
我又不希望所有的數(shù)據(jù)都可以修改,只希望修改某些特定的列,用下面的方法即可2008-10-10