Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

虛擬主機上實現 ASP.NET URL Rewrite:Global.asax + Regex 方案

編輯:關於伺服器

誤區澄清

  • HttpHandler 無法實現 URL Rewrite,它處理特定副檔名請求,不攔截所有路徑。
  • Server.Tranfer 是伺服器端轉向,瀏覽器網址列不變,但屬於「重定向」而非真正的 Rewrite (URL 重寫)。

虛擬主機限制與對策

虛擬主機無權修改 IIS 設定、安裝 ISAPI Rewrite 模組。但 ASP.NET 管線允許在 Global.asax 的 Application_BeginRequest 事件中攔截請求並重寫路徑,僅限 .aspx 等已對應 ASP.NET 的副檔名。

實作步驟

  1. 開啟 Global.asax.cs (或 Global.asax 配合 <script runat="server">)。
  2. 定位 Application_BeginRequest 方法,加入重寫邏輯:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
    string oldUrl = HttpContext.Current.Request.RawUrl;
    // 例:/default/123.aspx → /default.aspx?id=123
    string pattern = @"^(.+)default/(\d+)\.aspx(\?.*)*$";
    string replace = "$1default.aspx?id=$2";

    if (Regex.IsMatch(oldUrl, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled))
    {
        string newUrl = Regex.Replace(oldUrl, pattern, replace, RegexOptions.Compiled | RegexOptions.IgnoreCase);
        this.Context.RewritePath(newUrl);  // 核心:伺服器端內部重寫,瀏覽器無感
    }
}

運作原理

  1. 使用者請求 /default/123.aspx (實體檔案不存在)。
  2. ASP.NET 管線觸發 BeginRequest,Regex 比對成功。
  3. Context.RewritePath 將內部路徑改為 /default.aspx?id=123。
  4. 後續執行 default.aspx,Request.QueryString["id"] 取得 123。
  5. 瀏覽器網址列保持 /default/123.aspx,達到 URL Rewrite 效果。

擴展建議

  • 利用 Regex 群組捕獲,支援多種重寫規則 (如 /product/456/detail.aspx → /product.aspx?id=456&view=detail)。
  • 若為自有伺服器,可在 IIS 對應額外副檔名 (如 .myweb) 至 aspnet_isapi.dll,擴展至任意副檔名。
  • 效能考量:Regex 編譯選項 Compiled 提升比對速度;規則過多建議改用 HttpModule 集中管理。
Copyright © Windows教程網 All Rights Reserved