Asp.net-Mvc-2

MVC 參數中的加號 (+) 在 IIS 7.0 上導致 404

  • July 30, 2010

我有一個 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>

引用自:https://stackoverflow.com/questions/3375789