首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 無副檔名 URL 重寫:IIS 404 錯誤頁面攔截 + Server.Transfer 實現 REST 風格網址 (無需 ISAPI)

     編輯:關於ASP.NET

早期 ASP.NET (1.x/2.0) 無內建路由,若想實現 /category/1 這類無副檔名 URL,常用 IIS 404 自定義錯誤頁面 + Server.Transfer 技巧,無需安裝 ISAPI Filter。

核心原理

  1. 用戶請求 https://site.com/jyk (不存在實體檔案/資料夾)。
  2. 2. IIS 觸發 404 錯誤,依設定導向 /None.aspx。 3. None.aspx 從 Request.Url.Query 取得原始 URL (?404;https://site.com/jyk)。 4. 解析路徑,Server.Transfer("Category.aspx?id=jyk") 內部轉交。 5. 瀏覽器地址列保持 /jyk,內容為 Category.aspx 輸出。

IIS 設定步驟 (IIS 5/6)

  1. IIS 管理器 → 網站右鍵「屬性」 → 「自定義錯誤」標籤。
  2. 2. 選取「404」 → 「編輯」 → 「訊息類型」選 URL** → 輸入 /None.aspx。 3. 確定套用。

IIS 404 自定義錯誤設定

None.aspx 核心代碼

protected void Page_Load(object sender, EventArgs e)
{
    // Request.Url.Query 格式:"?404;https://site.com/jyk"
    string raw = Request.Url.Query;
    if (raw.StartsWith("?404;")) raw = raw.Substring(5);

    // 解析路徑 (簡易範例:/jyk → Category.aspx?id=jyk)
    Uri uri = new Uri(raw);
    string path = uri.AbsolutePath.TrimStart('/'); // "jyk"

    string target;
    switch (path)
    {
        case "jyk": target = "Category.aspx?id=jyk"; break;
        case "admin": target = "Admin/Default.aspx"; break;
        default: target = "Default.aspx"; break;
    }

    Server.Transfer(target); // 內部轉交,URL 不變
}

優缺點分析

優點缺點
支援無副檔名 URL、REST 風格需修改 IIS 404 設定 (需伺服器管理權限)
無需建立大量資料夾/檔案效能稍低 (經過 404 → None.aspx → Transfer)
支援搜尋引擎收錄 (URL 不變)ASP 不支援 (Transfer 不帶參數)
可配合萬用網域解析所有 404 皆經此頁,需小心排除靜態資源

現代替代方案 (ASP.NET 4.0+ / Core)

  • ASP.NET Routing:routes.MapPageRoute("Cat", "category/{id}", "~/Category.aspx") (WebForms)。
  • URL Rewrite Module (IIS 7+):XML 規則檔 web.config <rewrite>,功能最強、效能最好。
  • ASP.NET Core Middleware:app.UseRewriter() / app.MapGet() 原生支援。

此 404 技巧是早期 ASP.NET 開發者智慧結晶,理解其原理有助於掌握現代路由/重寫機制的本質:攔截請求 → 解析路徑 → 內部分派。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved