Windows-Server-2003

IIS 404 自定義錯誤

  • July 12, 2012

我已將 ASP.NET 3.5 應用程序部署到 64 位 Windows 2003 R2 伺服器。

在 web.config 我有以下

<customErrors mode="RemoteOnly"
             defaultRedirect="/404/">
 <error statusCode="404"
        redirect="/404/"/>

 <error statusCode="500"
        redirect="/500/"/>
</customErrors>

在 IIS 管理器的網站屬性中,我將 404 和 500 錯誤設置為 Type = “URL” 以及與 web.config 中相同的 URL。

我有一個萬用字元應用程序映射到 .NET 2.0 aspnet_isapi.dll 並關閉了“驗證文件是否存在”。

如果我嘗試點擊一個假的 .aspx 文件,我會成功發送到 404 頁面。我相信這是因為.aspx 到.NET DLL 的顯式映射。

如果我嘗試訪問一個虛假目錄,我只會收到一個純文字響應,上面寫著:

該系統找不到指定的文件。

這些對目錄的請求似乎沒有通過 .NET 管道路由,這是我期望(並且需要)發生的,因為萬用字元應用程序映射。

有任何想法嗎?

為了測試你的邏輯,我實際上走過了完整的過程。我使用 ETW 跟踪 IIS 和 ASP.NET 以及程序監視器來查看發生了什麼。這是我發現的:

  1. 當您為 aspnet_isapi.dll 添加“萬用字元映射”且未選中“驗證該文件是否存在”時,所有請求實際上都通過 .net 管道
  2. 當您訪問虛假目錄時,.net 實際上會查找所有 .config 文件。即 machine.config、root web.config(位於 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG)和您的 Web站點根目錄以查找可以處理您的請求的可能的 HttpHandler
  3. 由於沒有一個處理程序被配置為處理“目錄”請求,因此請求會退回IISGeneral: GENERAL_STATIC_FILE_HANDLER並失敗,0x80070002即 FILENOTFOUND
  4. 由於您將 IIS 自定義錯誤 404 配置為 /404/,因此它會查看目錄 c:\inetpub\wwwroot\404\,然後因另一個錯誤而失敗0x80070002並發送一般The system cannot find the file specified.錯誤。
  5. 當您訪問偽造的 main.aspx 頁面時,.aspx 請求在根 web.config 文件中處理,因此您會看到 .net 特定(找不到資源。)錯誤。
  6. 現在,當您為“萬用字元映射”選中“驗證該文件是否存在”時,伺服器會在將副檔名映射到應用程序之前檢查請求的腳本是否存在
  7. 因此,請求永遠不會通過 .net 管道並給您提供第 4 點中所述的錯誤。

希望這可以幫助。

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