MVC 參數中的加號 (+) 在 IIS 7.0 上導致 404
我有一個 MVC 路由,它讓我在執行 IIS 的登台伺服器上陷入困境。我在本地執行 Visual Studio 2010 的開發伺服器。
這是一個實際適用於我的開發框的範例 URL:
Root/CPUBoards/Full+Size Results Server Error404 - File or directory not found. The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable.這是我看到的完整行為。
本地主機:
Root/CPUBoards/Full Size - Resolves Root/CPUBoards/Full%20Size - Resolves Root/CPUBoards/Full+Size - Resolves帶有 IIS 7.0 的登台伺服器:
Root/CPUBoards/Full Size - Resolves Root/CPUBoards/Full%20Size - Resolves Root/CPUBoards/Full+Size - 404 Not Found Error.有任何想法嗎?我需要使用編碼版本有幾個原因……不會浪費你的時間。
HttpUtility.UrlEncode(“Full Size”) 返回帶有加號的版本… Full+Size。這適用於我的開發盒,但不適用於登台伺服器。我寧願讓它在伺服器上執行,因為我已經測試了所有其他內容並在本地執行,但我不知道從哪裡開始查看伺服器配置以使其行為相同。
謝謝!
+僅具有作為application/x-www-form-urlencoded數據中的空格的特殊含義,例如 URL 的查詢字元串部分。在 URL 的其他部分,如路徑組件,
+字面意思是加號。所以解析Full+Size為未編碼的名稱Full Size不應該在任何地方工作。路徑組件中唯一正確的空格形式是
%20. (當您鍵入實際空格時它仍然有效,因為瀏覽器會發現錯誤並為您更正。)%20也適用於表單 URL 編碼的數據,因此始終使用它通常是最安全的。可悲
HttpUtility.UrlEncode的是被誤導性命名。它+在其輸出中生成而不是%20,因此它實際上是一個表單 URL 編碼器,而不是標準 URL 編碼器。不幸的是,我不知道有一個 ASP.NET 函式可以“真正對 URL 編碼”字元串以在路徑中使用,所以我只能推薦在編碼後對+to進行字元串替換。%20或者,避免在路徑部分使用空格,例如。通過將它們替換為
-.%nn將“slug”標題插入 URL 是很常見的,將它們簡化為簡單的字母數字和“安全”標點符號,以避免用難看的序列填充 URL 。
這是 IIS 安全設置。有一個標準的請求過濾器拒絕包含 +(加號)字元的 URL。
您可以為您的網路禁用它,將其添加到您的 web.config 中:
<configuration> ... <system.webServer> ... <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer> ... </configuration>