網址末端出現句號(.、Period、Dot)引發HTTP 500錯誤

在Microsoft Windows Server - IIS中無論是ASP.NET WebForms還是ASP.NET MVC,只要在網址的最末端(最後面、結尾)出現英文的句號(.、Period、Dot),就會觸發500 Internal Server Error,錯誤訊息如下所列:

'/' 應用程式中發生伺服器錯誤。
執行階段錯誤
描述: 處理您的要求時發生例外狀況。此外,執行第一個例外狀況的自訂錯誤頁面時發生另一個例外狀況。要求已終止。

Server Error in '/' Application.
Runtime Error
Description: An exception occurred while processing your request. Additionally, another exception occurred while executing the custom error page for the first exception. The request has been terminated.

設定錯誤網頁(Error Page)是沒用的

一般來說,我們不太可能會在網址的最末端出現句號,但也難保說不會發生,例如下列查詢縮寫的例子:

http://127.0.0.1/Query/Crop.
http://127.0.0.1/Query.aspx?Words=Crop.

真的要解決這個詭異的問題,其實去設定IIS的錯誤網頁(Error Page)是沒有用的,最終他還是會吐出HTTP 500的錯誤,例如下圖:

正確做法,設定Web.Config中的relaxedUrlToFileSystemMapping

介面式的作法 - 1:進入IIS,點選左邊樹狀網站根目錄,點選「設定編輯器」。

介面式的作法 - 2:下拉區段至System.Web/httpRuntime,找到relaxedUrlToFileSystemMapping將其設定為True。

直接開啟Web.Config的作法

這種做法我想不用多說了,直接看XML即可。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <httpRuntime relaxedUrlToFileSystemMapping="true" />
  </system.web>
</configuration>

發生錯誤的原因

微軟家大業大,只要一做不好、一出現漏洞就會被網路公幹,例如BSOD(blue screen of death)我可能超過10年沒看過了,但仍然每次都會被人家拿來嘲諷,好像一副MacOS、Linux都不會當機一樣,我只能說我笑了。算了,這不是這篇文章要討論的重點。

微軟檢查這個,是因為IIS對應的Windows作業系統中的檔案目錄層級,而Windows中並不允許空白的附檔名,所以relaxedUrlToFileSystemMapping預設值當然就是false(也就是要嚴格檢查是否有對應檔案系統)。

PeriodAtTheEndOfURL DotAtTheEndOfURL