IIS7 URL 重寫包含 + 字元的 URL 中斷
我有一個 IIS7 伺服器,它充當其他幾個 Web 伺服器的反向代理。其他伺服器在不同的埠上執行,因此 IIS7 伺服器提供“友好的 URL”,並且都在埠 80 上。URL 重寫用於將請求傳遞給後端伺服器。
一種這樣的伺服器是 TeamCity(持續集成和建構伺服器)。該伺服器提供了一種下載建構結果(“建構工件”)的方法。通常,這些工件是一個 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
重寫規則匹配模式
(.*)
並使用重寫 URLhttp://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>