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

ASP.NET URL Rewriting 極簡實作:自訂 IHttpHandlerFactory

     編輯:ASP.NET 基礎

核心概念

ASP.NET 處理管線允許透過實作 IHttpHandlerFactory 攔截特定副檔名請求,並在 GetHandler 中以 context.RewritePath 將公開 URL 重寫為內部實體頁面,達到「靜態化 URL」與「隱藏真實路徑」的效果。

三步驟完成部署

1. IIS 設定 (以 IIS 6/7 經典模式為例)

  • 網站屬性 → 主目錄 → 設定 → 對應:新增 .zhtml 指向 aspnet_isapi.dll,勾選「驗證檔案是否存在」取消。
  • IIS 7+ 整合模式:直接在 web.config <system.webServer><handlers> 註冊即可,無須 IIS 介面操作。

2. web.config 註冊 Handler Factory

<system.web>
  <httpHandlers>
    <add verb="*" path="*.zhtml" type="ZDIL.URLRewriter.RewriterFactoryHandler, ZDILURLRewriter" />
  </httpHandlers>
</system.web>

ZDILURLRewriter 為編譯後的 DLL 檔名 (不含副檔名)。

3. 實作 RewriterFactoryHandler (獨立類別庫專案)

using System;
using System.Web;
using System.Web.UI;

namespace ZDIL.URLRewriter
{
    public class RewriterFactoryHandler : IHttpHandlerFactory
    {
        public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            string sendToUrl = url;                 // 瀏覽器請求的虛擬路徑 (如 /product/123.zhtml)
            string targetUrl = "/web/index.aspx";   // 真正處理的內部頁面
            string queryString = "";                // 可解析 sendToUrl 擷取參數

            string filePath = context.Server.MapPath(targetUrl);
            // 核心:重寫路徑,保持瀏覽器網址列不變
            context.RewritePath(targetUrl, String.Empty, queryString);

            // 回傳編譯後的頁面實例
            return PageParser.GetCompiledPageInstance(url, filePath, context);
        }

        public virtual void ReleaseHandler(IHttpHandler handler) { }
    }
}

進階:動態解析參數與多規則支援

public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
    string sendToUrl = url;
    string targetUrl = "/web/index.aspx";
    string queryString = "";

    // 範例:/product/123.zhtml → /web/index.aspx?cat=product&id=123
    var match = System.Text.RegularExpressions.Regex.Match(sendToUrl, @"/(?<cat>\w+)/(?<id>\d+)\.zhtml$");
    if (match.Success)
    {
        queryString = $"cat={match.Groups["cat"].Value}&id={match.Groups["id"].Value}";
    }

    string filePath = context.Server.MapPath(targetUrl);
    context.RewritePath(targetUrl, String.Empty, queryString);
    return PageParser.GetCompiledPageInstance(url, filePath, context);
}

優缺點評估

優點缺點
無需第三方元件,純 .NET Framework 實作需編譯獨立 DLL,部署稍繁瑣
完全控制重寫邏輯,支援正則/查表舊版 IIS 需設定萬用字元對應
效能優於 HttpModule + Response.Redirect不支援 IIS 7+ 整合模式原生模組優勢

現代替代方案

  • ASP.NET 4.0+:System.Web.Routing (Web Forms Routing) 或 UrlRoutingModule。
  • ASP.NET Core:內建 Endpoint Routing、MapControllerRoute、MapRazorPages。
  • IIS 7+:URL Rewrite Module (web.config <rewrite> 規則),無需撰寫代碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved