本文來(lái)自:http://springkingster.javaeye.com/blog/175114
urlrewritefilter 下載: http://tuckey.org/urlrewrite/#download
所用基于動(dòng)態(tài)的url http://www.nihaoblog.com/content.jsp?id=1&contentid=404按照各大搜索引擎的喜好,應(yīng)該美化成http://www.nihaoblog.com/content/1_404.html靜
態(tài)網(wǎng)頁(yè)的方式,盡管目前的google及幾大搜索引擎宣稱支持動(dòng)態(tài)頁(yè)網(wǎng)的抓取,但與傳統(tǒng)的html文件相比較抓取率仍不在一個(gè)數(shù)量級(jí)。Apche的
mod_rewrite模塊具有此功能,但是對(duì)于租用虛擬主機(jī)的用戶來(lái)說(shuō)就比較麻煩不太可能對(duì)所有運(yùn)營(yíng)商有更多的要求,需要條件依賴就不具通用性。
目前有一個(gè)解決方法,通過(guò)
UrlRewriteFilter可以完全實(shí)現(xiàn)動(dòng)態(tài)URL表態(tài)化,你可以將它直接應(yīng)用到你的web應(yīng)用中,不管你用的是jsp+javabean還是struts.
下面是使用方法:
xml 代碼
- <filter>
- <filter-name>UrlRewriteFilter</filter-name>
- <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>UrlRewriteFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
根據(jù)自己的需要,將相應(yīng)目錄下的url轉(zhuǎn)給UrlRewriteFilter來(lái)處理。
3、配置urlwrite規(guī)則文件WEB-INF/urlrewrite.xml
配置如下:
- <rule>
- <from>/content/([0-9]+)_([0-9]+).html</from>
- <to>/content.jsp?id=$1&contentid=$2</to>
- </rule>
xml 代碼
注意:有多個(gè)參數(shù)時(shí),中的連接符號(hào)&應(yīng)該是&
每個(gè)網(wǎng)頁(yè)或請(qǐng)求都是一個(gè)url地址,一般,這個(gè)地址可能是.do,.page,.action之類的并加上'?'號(hào)、'&'號(hào)查詢串等構(gòu)成的一個(gè)長(zhǎng)長(zhǎng)的的url。很urgly。
一般的url----------------------------------------------------------較好的url
http://www.xxx.net/user/profile.do?id=20001 ====> http://www.xxx.net/user/20001
http://www.xxx.net/forum/board.do?name=java ====> http://www.xxx.net/forum/java
http://www.xxx.net/forum/thread.do?id=29923 ====> http://www.xxx.net/thread/29923
后者明顯較為直觀和漂亮。
使用url rewrite可以很好的改善這個(gè)狀況。網(wǎng)站url rewrite應(yīng)用是非常廣泛的,良好的url設(shè)計(jì)給用戶帶來(lái)的非常好的體驗(yàn),同時(shí)也能吸引搜索引擎的注意。
一
種rewrite稱為一個(gè)規(guī)則,上面的例子就是3個(gè)規(guī)則。rewrite技術(shù)可以在代理服務(wù)器實(shí)現(xiàn),或者可以在tomcat之類的java
web服務(wù)器實(shí)現(xiàn)。 Apache HTTP Server 2.x 和
mod_proxy提供了不錯(cuò)的Rewrite處理方法。so如果使用apache,則直接在apache中配置Rewrite即可。但是對(duì)于沒(méi)有使用代
理,或者不完全要在代理服務(wù)器配置Rewrite的web應(yīng)用,通過(guò)第三方Jar包也是可以實(shí)現(xiàn)很perfect的rewrite技術(shù)的。這是本帖的著重
點(diǎn)。
這個(gè)第三方包的地址是:http://tuckey.org/urlrewrite/ (待會(huì)再去這個(gè)網(wǎng)站,現(xiàn)在先別去)
這個(gè)包使用正則表達(dá)式仿照了apache rewrite的做法。而實(shí)現(xiàn)原理也是很明晰的:filter,forward,redirect機(jī)制組合:
在
web.xml配置一個(gè)UrlRewriteFilter,攔截所有進(jìn)來(lái)的請(qǐng)求,對(duì)服務(wù)要求的請(qǐng)求進(jìn)行rewrite。比如,對(duì)
http://www.xxx.net/user/([0-9]+)請(qǐng)求,forward到/profile.do?id=$1。這就是一條規(guī)則。在這個(gè)
第三方包中的規(guī)則文件urlrewrite.xml中可以這樣定義:
代碼
- <rule>
- <from>^/user/([0-9]+)/?$from>
- <totype="forward">/profile.do?id=$1to>
- <rule>
<script>render_code();</script>
對(duì)我來(lái)說(shuō),一般我會(huì)配置一個(gè)通用的rule,使所有沒(méi)有包含"."的url forward到.do的action上來(lái)(本人使用strut做系統(tǒng)較多)
代碼
- <rule>
- <note>
- - 這是一個(gè)通用請(qǐng)求url rewrite
- - 將請(qǐng)求forword url加上“.do”的處理器上。
- - 例:
- - 請(qǐng)求 http://{domain}/user/login 將被forward到 http://{domain}/user/login.do
- - 請(qǐng)求 http://{domain}/user/login/ 將被forward到 http://{domain}/user/login.do
- - 請(qǐng)求 http://{domain}/user/logout/ 將被forward到 http://{domain}/user/logout.do
- note>
- <from>^/([_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+)/?$from>
- <totype="forward">/$1.doto>
- <rule>
<script>render_code();</script>
上面只是介紹個(gè)大概,并不是urlrewriter這個(gè)jar包的使用指南。如果你覺(jué)得這種rewrite做法不錯(cuò)的話,不如直接訪問(wèn)這個(gè)網(wǎng)站吧 http://tuckey.org/urlrewrite/
第一步:從http://tuckey.org/urlrewrite/ 上下載urlrewrite-3.0.3.jar包,放到webapp classpath下
第二步:在web.xml配置UrlRewriteFilter:
代碼
- <filter>
- <filter-name>UrlRewriteFilterfilter-name>
- <filter-class>
- org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
- filter-class>
- <init-param>
- <param-name>logLevelparam-name>
- <param-value>WARNparam-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>UrlRewriteFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
<script>render_code();</script>
第三步:在web-inf下新建urlrewrite.xml文件,簡(jiǎn)單填入以下內(nèi)容:
代碼
- <!--sp-->xmlversion="1.0"encoding="utf-8"?>
- "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
-
- <urlrewrite>
- <rule>
- <note>
- - 這是一個(gè)通用請(qǐng)求url rewrite
- - 將請(qǐng)求forword url加上“.do”的處理器上。
- - 例:
- - 請(qǐng)求 http://{domain}/user/login 將被forward到 http://{domain}/user/login.do
- - 請(qǐng)求 http://{domain}/user/login/ 將被forward到 http://{domain}/user/login.do
- - 請(qǐng)求 http://{domain}/user/logout/ 將被forward到 http://{domain}/user/logout.do
- note>
- <from>^/([_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+)/?$from>
- <totype="forward">/$1.doto>
- rule>
-
- urlrewrite>
<script>render_code();</script>
第四步:?jiǎn)?dòng)web應(yīng)用,將原來(lái)需要.do的請(qǐng)求改為去掉.do后請(qǐng)求,看看結(jié)果。
第五步:更詳細(xì)的規(guī)則定義,請(qǐng)看http://tuckey.org/urlrewrite/manual/3.0/