URL Rewrite 後,<form action> 會變成重寫後的內部路徑(如 /User.aspx?name=jeffz),導致 PostBack 時瀏覽器網址列暴露內部結構,且可能因路徑不存在而失效。
<script>document.forms[0].action = window.location;</script>
缺點:原始碼可見、Fiddler 可攔截、不夠優雅。
建立 FormRewriterControlAdapter,攔截 action 屬性輸出,強制改為 Request.RawUrl(客戶端原始請求網址)。
public class FormRewriterControlAdapter : ControlAdapter {
protected override void Render(HtmlTextWriter writer) {
base.Render(new RewriteFormHtmlTextWriter(writer));
}
}
public class RewriteFormHtmlTextWriter : HtmlTextWriter {
public RewriteFormHtmlTextWriter(HtmlTextWriter w) : base(w) { InnerWriter = w.InnerWriter; }
public RewriteFormHtmlTextWriter(TextWriter w) : base(w) { InnerWriter = w; }
public override void WriteAttribute(string name, string value, bool fEncode) {
if (name == "action") {
var ctx = HttpContext.Current;
if (ctx.Items["ActionAlreadyWritten"] == null) {
value = ctx.Request.RawUrl;
ctx.Items["ActionAlreadyWritten"] = true;
}
}
base.WriteAttribute(name, value, fEncode);
}
}
在 App_Browsers 目錄新增 .browser 檔:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
adapterType="Namespace.FormRewriterControlAdapter" />
</controlAdapters>
</browser>
</browsers>
此法在伺服器端徹底修正 action,客戶端完全不可見內部重寫路徑,安全且優雅。