Kobarin's Development Blog

C#やASP.NET、公開APIなどについての記録です。

ASP.NETのPostback先URLに、Rewrite前のアドレスを設定したい

ASP.NETでURLの置き換えをする場合、通常Rewriteを使用します。
URLの置換え規則は正規表現で定義しますが、この辺りは他のサイト等でも多く書かれているので割愛します。
ここでは、ASP.NETのRewriteを使う際によく問題になる「Postback先URL」に触れたいと思います。


例えばクライアント側から以下のアドレスへの要求があったとします。

/site1/product/city-13101/price-980/ (BEFOREとします)

もちろんこれは仮想アドレスに過ぎず、実体は存在しません。Rewriteにより以下の実ページヘアクセスされます。

/site1/product.aspx?city=13101&price=980 (AFTERとします)

この場合、クライアントから見えているURLはBEFOREですが、ASP.NETとしてはAFTERとして認識されるため、Postback先URL(formタグのaction要素)も必然的にAFTERのアドレスが入ります。その結果、ここでSubmit等によりPostbackが発生すると、クライアントからAFTERのアドレスが丸見えになってしまうのです。


そこで、HTTP_REFERRERを使ってPostback先のURLを強引に書き換えてしまうのが、以下のコードです。

protected void Page_Load(object sender, EventArgs e)
{
  form1.Action = Request.RawUrl;
}

▼参考
ASP.NET postbacks creates problem in URL rewriting?


以前はMasterPageにformを設置した時期もありましたが、こういうのを見るとやはりページ単位にformを置くのが良いと感じますね。