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

ASP.NET URL Rewriting 完整實戰:美化網址、解決 404、提升 SEO

     編輯:關於ASP.NET

什麼是 URL Rewriting?

URL Rewriting(網址重寫) 是在伺服器端攔截傳入請求的 URL,依規則轉換為內部實際處理的 URL,過程對瀏覽器完全透明。使用者看到的是乾淨、有語意的網址,伺服器實際執行的是帶參數的動態頁面。

為什麼需要 URL Rewriting?

  • 使用者體驗:/products/widgets 比 /displayCategory.aspx?CategoryID=5 易記、易傳播、易猜測。
  • SEO:關鍵字出現在 URL、靜態化外觀有利搜尋引擎收錄與排名。
  • 解耦:內部檔案結構調整(移動目錄、更換技術)不影響對外連結與書籤。
  • 安全:隱藏實體檔名、查詢字串參數、資料庫結構。
  • 智慧 404:攔截不存在的舊網址,導向最相關新頁面或搜尋結果,而非冷冰冰的 404。

ASP.NET 實作三大主流方案

方案一:HttpModule(經典、相容性最好)

public class UrlRewriteModule : IHttpModule
{
    private static readonly List _rules = new List
    {
        new RewriteRule(@"^/products/([^/]+)/?$", "/displayCategory.aspx?category=$1"),
        new RewriteRule(@"^/product/(\d+)/?$", "/productDetail.aspx?id=$1"),
        new RewriteRule(@"^/blog/(\d{4})/(\d{2})/(\d{2})/([^/]+)/?$", "/blogPost.aspx?y=$1&m=$2&d=$3&slug=$4")
    };

    public void Init(HttpApplication context)
    {
        context.BeginRequest += (s, e) => {
            HttpApplication app = (HttpApplication)s;
            string path = app.Request.Path;
            foreach (var rule in _rules)
            {
                Match m = rule.Pattern.Match(path);
                if (m.Success)
                {
                    string newUrl = rule.Replacement;
                    for (int i = 1; i < m.Groups.Count; i++)
                        newUrl = newUrl.Replace("$" + i, m.Groups[i].Value);
                    app.Context.RewritePath(newUrl);
                    break;
                }
            }
        };
    }
    public void Dispose() { }
    class RewriteRule { public Regex Pattern; public string Replacement; public RewriteRule(string pattern, string repl) { Pattern = new Regex(pattern, RegexOptions.IgnoreCase); Replacement = repl; } }
}
web.config 註冊(IIS 7+ 整合管線):
<system.webServer>
  <modules>
    <add name="UrlRewriteModule" type="MyApp.UrlRewriteModule, MyApp" />
  </modules>
</system.webServer>

方案二:ASP.NET Routing (ASP.NET 3.5 SP1+ / 4.0 內建)

void Application_Start()
{
    RouteTable.Routes.MapPageRoute("ProductsByCategory", "products/{categoryName}", "~/displayCategory.aspx");
    RouteTable.Routes.MapPageRoute("ProductDetail", "product/{id:int}", "~/productDetail.aspx");
    RouteTable.Routes.MapPageRoute("BlogPost", "blog/{year:int}/{month:int}/{day:int}/{slug}", "~/blogPost.aspx");
}
  • 頁面取值:RouteData.Values["categoryName"] 或 Page.RouteData.Values["id"]。
  • 雙向:Page.GetRouteUrl("ProductsByCategory", new { categoryName = "widgets" }) 產生美化 URL。

方案三:URL Rewrite Module 2.0 (IIS 7+ 原生、效能最佳)

<system.webServer>
  <rewrite>
    <rules>
      <rule name="ProductsCategory" stopProcessing="true">
        <match url="^products/([^/]+)/?$" />
        <action type="Rewrite" url="displayCategory.aspx?category={R:1}" />
      </rule>
      <rule name="ProductDetail" stopProcessing="true">
        <match url="^product/(\d+)/?$" />
        <action type="Rewrite" url="productDetail.aspx?id={R:1}" />
      </rule>
      <rule name="LegacyAspxRedirect" stopProcessing="true">
        <match url="^displayCategory\.aspx$" />
        <conditions>
          <add input="{QUERY_STRING}" pattern="CategoryID=(\d+)" />
        </conditions>
        <action type="Redirect" url="products/{C:1}/" redirectType="Permanent" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>
  • 支援正則、條件、對應表、快取、記錄、SEO 301 永久導向。
  • 無需修改程式碼、無需重新編譯、效能最高(核心模組)。

進階主題

處理 Postback 與表單 Action

重寫後頁面回傳會導向重寫前的 URL,造成網址變醜。解決:

  • form.Action = Request.RawUrl; 在 Page_Load 設定。
  • 或使用 ControlAdapter 覆寫 RenderBeginTag 自動修正。

多語系網站 URL 結構

/en/products/widgets
/zh-tw/products/widgets
/ja/products/widgets

Routing 方案:RouteTable.Routes.MapPageRoute("LocalProducts", "{lang}/products/{category}", "~/displayCategory.aspx");

效能與快取

  • 規則集建議靜態快取、編譯為 RegexOptions.Compiled。
  • 避免在 BeginRequest 做資料庫查詢;若需動態規則,使用 IRouteConstraint 或 Rewrite Map。

遷移舊網址最佳實務

  1. 建立舊 URL → 新 URL 對應表(資料庫或 XML)。
  2. 在 HttpModule 或 Rewrite Rule 中優先比對對應表,發出 301 Moved Permanently。
  3. 提交新 Sitemap 給 Google Search Console。
  4. 監控 404 日誌,持續補充對應表。

方案選擇指南

需求推薦方案理由
ASP.NET 2.0 / IIS 6 相容、需程式碼控制邏輯HttpModule純 managed code、部署簡單、可單元測試
ASP.NET 4.0+、Web Forms、想要雙向產生 URLASP.NET Routing內建、型別安全、支援 GetRouteUrl
IIS 7+、追求最高效能、零程式碼、SEO 301、Rewrite MapURL Rewrite Module 2.0原生模組、效能最佳、支援對應表、條件、記錄

結語

URL Rewriting 是現代 Web 應用的標準配備。無論選擇 HttpModule、Routing 或 IIS Rewrite Module,核心原則相同:對外呈現乾淨語意網址,內部解耦實體結構。善用重寫技術不僅能美化網址、提升 SEO,更能優雅地處理網站重構、多語系、舊連結遷移與智慧 404,是提升專案專業度的關鍵技術之一。

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