【IIS】
一個網站如果用的是IIS(假設沒有在前端7層負載均衡中對這種場景進行特殊處理),只要在瀏覽器地址欄中輸入這個網站的域名並加上“.”,比如:www.cnblogs.com. ,就會引發“Bad Request - Invalid Hostname”錯誤:
由於這個錯誤信息是IIS底層直接返回的,如果只從IIS的角度,你沒有任何方法可以對這個錯誤信息進行定制與處理,包括微軟自己。
要解決這個問題,只能在IIS前端加上非基於IIS的7層負載均衡(或反向代理),比如Nginx、Tengine,然后針對這個場景對主機名進行重寫或者重定向、顯示自定義錯誤信息。
我們目前雖然用了基於Tengine的7層負載均衡(阿里雲SLB),但是SLB並沒有提供針對這個問題的解決方案,所以只能束手無策。
【ASP.NET】
如果一個網站用的是ASP.NET(假設沒有對以“.”結尾的URL進行重寫),只要在一個URL之后加上“.”,ASP.NET中所有的自定義錯誤設置都形同虛設。
微軟msdn博客站點也有這個問題:
要解決這個問題,需要借助IIS的URL重寫組件(比如Url Rewrite Module)針對這種情況進行URL重寫。
而我們用Url Rewrite Module解決這個問題的過程中發現竟然只能Rewrite,不能Redirect,
如果Action type改為Redirect,依然會顯示之前的錯誤頁面。
這兩個歷史悠久的問題更讓我們對ASP.NET vNext多了一份期待。
【更新】
之前寫的URL重寫規則不能處理以多個點結局的情況,改進后的重寫規則如下:
<rule name="end_with_dot" stopProcessing="true"> <match url="(.*)[^.]\.+$" /> <action type="Rewrite" url="{R:1}" /> </rule>