一、URL Rewrite
URL Rewrite是截取傳入Web 請求並自動將請求重新導向到其他URL的過程。
比如瀏覽器發來請求hostname/101.aspx ,伺服器自動將這個請求中定向為http://hostname/list.aspx?id=101。
URL Rewrite的優點在於:
1. 縮短URL,隱藏實際路徑提高安全性
2. 易於使用者記憶和鍵入
3. 易於被搜尋引擎收錄
有很多種手段實現URL Rewrite,我選擇了我認為最好的一種。這種方法的優點在於,不需要更改任何與IIS有關的設定,而且在中等信任安全等級的虛擬機器主機中,也可以使用。
二、實現細節
1. 準備URLRewrite.NET的類庫,將網站引用這個類庫;
2. 將configSections加入到configuration的第一節:
<configSections>
<section name="rewriter"
requirePermission="false"
type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
</configSections>
3. 將對httpModule的處理加入到system.web中:
<httpModules>
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />
</httpModules>
4. 在configuration中,加入對rewrite的設定:
<rewriter>
<rewrite url="~/Articles/(\d+)" to="~/Articles/Detail.aspx?id=$1" />
<rewrite url="~/Categories/(\d+)" to="~/Articles/List.aspx?id=$1" />
<rewrite url="~/Categories/(\d+)_(\d+)" to="~/Articles/List.aspx?id=$1&page=$2" />
</rewriter>
需要注意的是,當使用多個參數時,需要使用HTML逸出字元來代替&符號。
三、IIS配置
在IIS 7中,URLRewriter.NET可以不經配置正常使用,但是在IIS 6中,需要進行一些配置,詳見以下連結。
http://urlrewriter.net/index.php/support/installation/windows-server-2003
四、ASP.NET的Postback設定
由於在使用了UrlRewriter後,ASP.NET中的Postback機制導致頁面發生回送後,會在瀏覽器中使用其原始連結,容易使使用者發生困惑,也不利於搜尋引擎的檢索,故需要加以處理。
在ASP.NET 2.0後,我們可以通過使用控制項適配器的擴充架構來定製重寫<form>的action屬性,而不需要對頁面代碼做出任何改動。
1. 在App_Code中,加入FormRewriter.cs檔案:
using System.Web;
using System.Web.UI;
public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
{
protected override void Render(HtmlTextWriter writer)
{
base.Render(new RewriteFormHtmlTextWriter(writer));
}
}
public class RewriteFormHtmlTextWriter : HtmlTextWriter
{
public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
: base(writer)
{
InnerWriter = writer.InnerWriter;
}
public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
: base(writer)
{
InnerWriter = writer;
}
public override void WriteAttribute(string name, string value, bool fEncode)
{
if ((name == "action"))
{
HttpContext Context = HttpContext.Current;
if (Context.Items["ActionAlreadyWritten"] == null)
{
value = Context.Request.RawUrl;
Context.Items["ActionAlreadyWritten"] = true;
}
}
base.WriteAttribute(name, value, fEncode);
}
}
2. 在App_Browsers中,加入Form.browser檔案:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="FormRewriterControlAdapter" />
</controlAdapters>
</browser>
</browsers>
這樣處理後,就可以保證頁面在發生Postback後,仍然使用原來的URL作為連結。
轉自:http://kb.vigal.net/asp-net-url-rewrite/