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

ASP.NET 利用 HttpModule 實現二級域名偽靜態路由

     編輯:ASP.NET 基礎

基於 HttpModule 的二級域名重寫實戰

許多開發者為實現二級域名 (如 user1.site.com) 而引入第三方組件,實際上 ASP.NET 內建 IHttpModule 機制即可完美支援。本文展示如何攔截請求、解析子域名、重寫路徑,實現無組件依賴的偽靜態路由。

核心原理

ASP.NET 請求生命週期中,每個請求會建立獨立的 HttpContext 實例。實作 IHttpModule 介面的 Init(HttpApplication context) 方法,掛載 BeginRequest 事件,即可在管線早期介入 URL 重寫。

關鍵代碼實現

public class URLRewriter : IHttpModule 
{
    public void Init(HttpApplication app) 
    {
        app.BeginRequest += OnBeginRequest;
    }

    private void OnBeginRequest(object sender, EventArgs e) 
    {
        HttpApplication app = (HttpApplication)sender;
        HttpContext context = app.Context;
        string url = context.Request.Url.AbsoluteUri; // 完整 URL
        
        // 解析子域名 (假設格式: sub.domain.com)
        string host = context.Request.Url.Host;
        string[] parts = host.Split('.');
        if (parts.Length >= 3) // 至少三段: sub + domain + tld
        {
            string subDomain = parts[0].ToLower();
            // 排除 www 等常見前綴
            if (subDomain != "www") 
            {
                // 重寫路徑: /User/Index?sub=xxx
                string newPath = $"/User/Index?sub={subDomain}";
                context.RewritePath(newPath);
            }
        }
    }

    public void Dispose() { }
}

Web.config 註冊

<system.web>
  <httpModules>
    <add name="URLRewriter" type="Common.URLRewriter" />
  </httpModules>
</system.web>

<!-- IIS 7+ 整合管線模式 -->
<system.webServer>
  <modules>
    <add name="URLRewriter" type="Common.URLRewriter" />
  </modules>
</system.webServer>

IIS 部署關鍵設定

  • 網站綁定:主機標頭留空,接收所有子域名請求。
  • DNS 配置:泛解析 *.domain.com 指向伺服器 IP。
  • 應用程式池:啟用 Integrated 管線模式。

進階擴展建議

  1. 緩存子域名解析結果,減少字串分割開銷。
  2. 結合路由表 (RouteTable.Routes) 實現更靈活的 MVC/WebForms 統一路由。
  3. 增加子域名白名單/黑名單驗證,防止惡意子域名攻擊。

此方案完全基於 .NET Framework 內建機制,無第三方依賴,掌握核心管線即可靈活擴展,是理解 ASP.NET 請求處理的絕佳實踐案例。

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