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

ASP.NET 偽靜態/URL 重寫三大經典實現方案全解析

     編輯:ASP.NET 基礎

偽靜態核心價值

  • SEO 友好:靜態化 URL 更利於搜索引擎收錄權重
  • 用戶體驗:/article/123.html 優於 /article.aspx?id=123
  • 安全隱匿:隱藏技術棧細節、參數結構,降低攻擊面
  • 鏈接穩定:后端重構不影響前端入口

方案一:IHttpHandler 自定義處理器(輕量、無依賴)

核心類實現

public class UrlRewriter : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        try
        {
            string rawUrl = context.Request.RawUrl;
            // 正則匹配 /show-12-34.html
            Regex regex = new Regex(@"/show-(\d+)-(\d+)\..+", RegexOptions.IgnoreCase);
            Match match = regex.Match(rawUrl, rawUrl.LastIndexOf('/'));
            
            if (match.Success)
            {
                string realPath = $"~/aspx/show.aspx?type={match.Groups[1]}&id={match.Groups[2]}";
                // Server.Execute 保持原請求上下文,支持 Session/表單驗證
                context.Server.Execute(realPath);
            }
            else
            {
                context.Response.Redirect(context.Request.Url.ToString());
            }
        }
        catch
        {
            context.Response.Redirect(context.Request.Url.ToString());
        }
    }
    
    public bool IsReusable => false;
}

Web.config 註冊


  
    
    
    
    
  



  
    
  

方案二:控制項適配器修正 PostBack Action(解決回發暴露真實 URL)

核心問題

偽靜態頁面包含表單回發時,<form action="real.aspx?id=1"> 會暴露真實動態 URL。

MyActionlessForm 解決方案

namespace MyURL
{
    public class MyOLPage : Page
    {
        protected override void Render(HtmlTextWriter writer)
        {
            // 替換 Writer 攔截 form action 輸出
            TextWriter baseWriter = writer.InnerWriter;
            if (writer is Html32TextWriter)
                writer = new FormFixerHtml32TextWriter(baseWriter);
            else
                writer = new FormFixerHtmlTextWriter(baseWriter);
            
            base.Render(writer);
        }
    }

    internal class FormFixerHtml32TextWriter : Html32TextWriter
    {
        private readonly string _fakeUrl;
        public FormFixerHtml32TextWriter(TextWriter writer) : base(writer)
        {
            _fakeUrl = HttpContext.Current.Request.RawUrl;
        }
        public override void WriteAttribute(string name, string value, bool encode)
        {
            if (_fakeUrl != null && string.Equals(name, "action", StringComparison.OrdinalIgnoreCase))
                value = _fakeUrl;
            base.WriteAttribute(name, value, encode);
        }
    }
    // HtmlTextWriter 版本同理...
}

使用方法

  1. 編譯為 MyActionlessForm.dll 並引用
  2. 頁面繼承修改:public partial class MyPage : MyURL.MyOLPage
  3. 解決編譯衝突:排除項目中同名 .cs 文件,僅保留 DLL 引用

方案三:Microsoft URLRewriter.dll(功能豐富、配置驅動)

獲取與編譯

下載源碼:Microsoft URL Rewriter,VS 編譯生成 DLL。

Web.config 完整配置


  
    
~/web/new/type/([0-9]+)\.html ~/web/new.aspx?id=$1 ~/web/index.html ~/web/index.aspx

IIS 映射配置(關鍵)

  1. IIS 管理器 → 網站 → 處理程序映射
  2. 添加腳本映射:請求路徑 *.html,可執行文件指向 aspnet_isapi.dll (如 C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll)
  3. 取消勾選「驗證文件是否存在」

三大方案對比選型

維度IHttpHandler控制項適配器URLRewriter.dll
實現複雜度低中低(配置為主)
正則靈活性代碼控制不涉及重寫配置文件正則
PostBack 修正需額外處理原生解決需額外處理
性能高略有開銷中等
維護性代碼分散繼承侵入性集中配置
推薦場景簡單重寫規則表單回發頁面規則多、頻變

現代 ASP.NET Core 方案

// Startup.cs
app.UseRewriter(new RewriteOptions()
    .AddRewrite(@"^show-(\d+)-(\d+)\.html$", "show.aspx?type=$1&id=$2", skipRemainingRules: true)
    .AddRedirect(@"^old-page\.aspx$", "new-page.html"));

// 或使用 MapWhen 分支管道
app.MapWhen(ctx => ctx.Request.Path.Value.EndsWith(".html"), 
    branch => branch.Use(async (ctx, next) => 
    {
        // 自定義重寫邏輯
        await next();
    }));

根據項目架構、團隊習慣、規則複雜度選擇最合適方案,漸進式遷移至現代中間件體系。

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