Iis

IIS7 URL 重寫包含 + 字元的 URL 中斷

  • November 7, 2012

我有一個 IIS7 伺服器,它充當其他幾個 Web 伺服器的反向代理。其他伺服器在不同的埠上執行,因此 IIS7 伺服器提供“友好的 URL”,並且都在埠 80 上。URL 重寫用於將請求傳遞給後端伺服器。

一種這樣的伺服器是 TeamCity(持續集成和建構伺服器)。該伺服器提供了一種下載建構結果(“建構工件”)的方法。通常,這些工件是一個 zip 存檔。這是一個範例網址:

http://build.teamserver.tigranetworks.co.uk/repository/download/bt25/4164:id/ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip

中的 + 字元ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip實際上是最終文件名中的空格;TeamCity 伺服器放入 + 字元。

點擊此連結時,我從 IIS7 伺服器收到以下錯誤:

404 - 找不到文件或目錄。

您要查找的資源可能已被刪除、名稱已更改或暫時不可用。

IIS7 日誌文件中出現的實際 URL 是:

/repository/download/bt25/4164:id/ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip

重寫規則匹配模式(.*)並使用重寫 URL

http://localhost:8022/ {R:1}

現在這是有趣的事情。如果我回到我的瀏覽器並編輯掉那些 + 字元,小心地用空格替換它們,那麼 URL 就可以工作了!

我的結論是 URL 重寫在某種程度上不適用於那些 + 字元。這是一個已知的問題?有什麼建議麼?

‘+’ 符號實際上不是有效的空格 URL 編碼。TeamCity 應該將它們編碼為 %20。

無論哪種方式,該錯誤都可能是IIS7 中常見的requestFiltering 安全設置的結果。

嘗試以下命令:

%windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true

它應該阻止 IIS 為 URL 中帶有 + 的任何內容返回 404。

由於 h0tw1r3 已經回答,您必須禁用 URL 驗證。

如果您想在IIS 伺服器級別執行此操作,請使用以下命令:

%windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true

如果您只想在應用程序級別禁用它,那麼您只需將以下部分添加到您的 web.config 文件中:

<system.webServer>
   <security>
       <requestFiltering allowDoubleEscaping="true" />
   </security>
</system.webServer>

引用自:https://serverfault.com/questions/291345