早期 ASP.NET (1.x/2.0) 無內建路由,若想實現 /category/1 這類無副檔名 URL,常用 IIS 404 自定義錯誤頁面 + Server.Transfer 技巧,無需安裝 ISAPI Filter。
https://site.com/jyk (不存在實體檔案/資料夾)。/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 輸出。
/None.aspx。
3. 確定套用。

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 皆經此頁,需小心排除靜態資源 |
routes.MapPageRoute("Cat", "category/{id}", "~/Category.aspx") (WebForms)。web.config <rewrite>,功能最強、效能最好。app.UseRewriter() / app.MapGet() 原生支援。此 404 技巧是早期 ASP.NET 開發者智慧結晶,理解其原理有助於掌握現代路由/重寫機制的本質:攔截請求 → 解析路徑 → 內部分派。