在 Windows Server 2008 + IIS 7 + PHP 環境中,URL 重寫規則匹配包含加號 + 或空格的路徑時,常出現 404 錯誤。根因在於 IIS 請求過濾模組預設雙重編碼檢查機制,將 + 視為空格編碼 (%20) 並拒絕請求。本文提供兩種修正方案,並分析適用場景。
IIS requestFiltering 模組預設 allowDoubleEscaping="false"。當 URL 經過一次編碼 (如 + → %2B) 再次進入 IIS 管線時,被視為「雙重編碼」而觸發 404.11 錯誤。此行為雖提升安全性,卻干擾合法帶特殊字元的 RESTful URL 或搜尋查詢。
僅影響單一網站,風險可控,部署簡單。
<configuration>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
</configuration>
操作步驟:
web.config (不存在則新建)。<system.webServer> 區段內加入 <security><requestFiltering allowDoubleEscaping="true" /></security>。影響該 IIS 實例下所有網站,適合多站點統一需求,但需謹慎操作。
<configuration>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
</configuration>
操作步驟:
%windir%\System32\inetsrv\config\applicationHost.config。<requestFiltering> 節點 (約第 360 行)。<requestFiltering allowDoubleEscaping="true">。iisreset 重啟服務。| 維度 | 方案一 (web.config) | 方案二 (applicationHost.config) |
|---|---|---|
| 影響範圍 | 單一站點 | 全伺服器所有站點 |
| 部署權限 | 網站管理員可操作 | 需伺服器管理員權限 |
| 風險隔離 | 高,問題不波及其他站點 | 低,全域放寬可能引入其他站點風險 |
| 維護性 | 隨網站代碼版控,遷移無憂 | 需額外記錄伺服器配置變更 |
最佳實踐:優先採用方案一。僅當確定所有站點均需支援雙重編碼 URL,且經過風險評估後,才考慮方案二。修改後務必測試包含 +、%20、%2B 等編碼組合的 URL,確認重寫規則正確匹配。