UrlRewriter.NET 是開源 URL 重寫庫,支援 .NET 2.0。實務專案中常遇到兩大問題:授權請求階段重寫導致「Object moved」訊息、PostBack 表單 Action URL 錯誤導致驗證控制項失效。本文提供根因分析與程式碼級修正方案。
首次載入頁面頂部出現「Object moved to here」文字,頁面正常但體驗不佳。
預設 Intelligencia.UrlRewriter.RewriterHttpModule 掛載於 BeginRequest 事件。專案使用 Forms 認證,認證模組在 AuthenticateRequest 階段執行,若重寫發生在認證前,導致授權檢查對象路徑不一致,觸發重導向回應標頭輸出殘留訊息。
// 修改 RewriterHttpModule.Init 方法
void IHttpModule.Init(HttpApplication context)
{
// 原始:context.BeginRequest += new EventHandler(BeginRequest);
context.AuthorizeRequest += new EventHandler(BeginRequest); // 在授權後、處理前重寫
}
確保 URL 重寫發生於認證授權完成之後,避免授權模組對原始路徑做決策後又被重寫導致不一致。
重寫後頁面按鈕 PostBack 失效,或驗證控制項(RequiredFieldValidator 等)完全不工作。
<form id="form1" runat="server"> → <rewriter:Form id="form1" runat="server">
副作用:所有驗證控制項失效(內建 Form 未正確實作驗證腳本註冊)。
App_Browsers 資料夾(專案右鍵 → 加入 → 新增資料夾 → 命名 App_Browsers)。UrlRewriter.browser 檔案:<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
adapterType="Intelligencia.UrlRewriter.FormRewriterControlAdapter" />
</controlAdapters>
</browser>
</browsers>
原始碼缺少接受 TextWriter 的建構函數,導致實例化失敗拋出例外。需修改原始碼重新編譯:
namespace Intelligencia.UrlRewriter
{
public class FormRewriterControlAdapter : ControlAdapter
{
// ... 現有程式碼 ...
// 新增建構函數
public FormRewriterControlAdapter() : base() { }
// 或針對 HtmlTextWriter 衍生類別
public class RewriteFormHtmlTextWriter : HtmlTextWriter
{
public RewriteFormHtmlTextWriter(TextWriter writer) : base(writer)
{
this.InnerWriter = writer;
}
// ... 覆寫 WriteAttribute 等方法重寫 action URL ...
}
}
}
HtmlForm 原生渲染保留驗證腳本註冊)。form.action 自動重寫為原始請求 URL(使用者見到的網址),維持書籤/重新整理一致性。Intelligencia.UrlRewriter.dll(已套用上述兩項修正並重新編譯強名稱)。web.config 註冊模組:<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule" />(位於 <system.web>/<httpModules> 或 IIS7+ <system.webServer>/<modules>)。web.config 設定重寫規則(<rewriter> 區段)。App_Browsers/UrlRewriter.browser 檔案。System.Web.Routing,功能更強、維護性更好。urlMappings(見文章 19056)。針對 UrlRewriter.NET 兩大經典痛點施以精準程式碼修正,即可在 ASP.NET 2.0 專案穩定使用強大 URL 重寫功能,並保留驗證控制項完整運作。