Jen

關於 UrlRewrite ...

最近早上起來除了幫老爺子關心一下慘綠的股市外, 研究了一下UrlRewriting in asp.net 2.0, 先來看一下

(1)http://www.somebloghost.com/Blogs/Posts.aspx?Year=2006&Month=12&Day=10

(2)http://www. somebloghost.com/Blogs/2006/12/10/

好看,好管理之外, 對於Search Engine的蜘蛛來說,接受度也相對比較好一些.
就介紹一下在asp.net 20 UrlWriting常見的方式.

(1)Native Url Mapping

<urlMappings enabled="true">
   <add url="~/Info/Copyright.aspx" mappedUrl="~/Help/Copyright.aspx" />
   <add url="~/Support/Contacts.aspx" mappedUrl="~/Help/Contacts.aspx" />
</urlMappings>
很方便是沒錯啦, 但缺點是如果你有寫postback事件的話, UrlRewrite 就等於無用...
就像

<form name="formTest" method="post"
action="Help/Contacts.aspx" id="formTest">
</form>
所以postback之後, 就回到原本的狀態...沒變嘛.
真正的大絕是
http://www.simple-talk.com/dotnet/asp.net/a-complete-url-rewriting-solution-for-asp.net-2.0/
這裏教的才是真正的大絕招啊!!!

你只要在web.config裏加上

<rewriteModule>
  <rewriteOn>true</rewriteOn>
  <rewriteRules>
      <rule source="(\d+)/(\d+)/(\d+)/"
         destination="Posts.aspx?Year=$1&amp;Month=$2&amp;Day=$3"/>
      <rule source="(.*)/Default.aspx"
         destination="Default.aspx?Folder=$1"/>
  </rewriteRules>
</rewriteModule>

透用Regular Expression來做urlRewrite的rule, 超有彈性, 也超級方便,有興趣的人可以研究一下.我之前研究BlogEngine的寫法是比較死的, 直接寫一個IHttpModule, 把Rule寫死在裏面,這個就比較沒人性了...不不不,是沒彈性.

但要注意的就是,<!--路徑都會跟著變--><img src="~/path..." />
解決方式是:<img src="<%=ResolveUrl("~/Images/Test.jpg")%>" />

我自已則是在Mircale Maker的專案中寫了簡單的HttpModule, 做簡單的UrlReWrite,

private void context_BeginRequest(object sender, EventArgs e)
{
     HttpContext context = ((HttpApplication)sender).Context;
     string url = context.Request.RawUrl.ToLowerInvariant();
     //<rule source="(.*)/Default.aspx" destination="Default.aspx?Folder=$1"/>
     Regex re = new Regex("(.*)/index.aspx",RegexOptions.IgnoreCase);
     Match match = re.Match(url);

     if (match.Success)
     {
          string v = match.Captures[0].Value;
          string rewUrl = re.Replace(url, "master.aspx?p=$1");
          context.RewritePath("~/master.aspx?p=" + rewUrl.Substring(rewUrl.LastIndexOf("/") + 1));
     }
}

1 意見:

  Wilson

2008年11月26日 下午9:39

請問一下
你寫的這個
private void context_BeginRequest(object sender, EventArgs e)
要放在哪個檔案裡

用了這個,就不需要在圖片前加上ResolveUrl了嗎

多謝您的答覆
謝謝