通常我們為了更好的緩解伺服器壓力,和增強搜尋引擎的友好面,都將文章內容生成靜態頁面。
但是有時為了能即時的顯示一些訊息,或者還想運用動態腳本解決一些問題,不能用靜態的方式來展示網站內容,必須用到動態頁面顯示。
這樣以來,就損失了對搜尋引擎的友好面,怎麼樣在兩者之間找個中間方法呢,如何增強你網站中地址的可讀性和讓搜尋引擎快速的收錄到你的站點?
這就需要你美化你的網頁的位址,這就產生了偽靜態技術,也就是我們常說的Url Rewriter重寫技術。就是當我們造訪一個頁面時,網址列中展示出來的是以「.html」結尾的靜態頁面形式,而實際上我們造訪的動態網頁。這裡就需要用到UrlRewriter技術。
大家熟悉的可能有很多伺服器都提供Url重寫的技術,以前我們用的最多的就是Apache,Jboss這樣一些伺服器自帶的一些Url重寫,但是他們的配置比較麻煩,性能又不是太好。現在我們有專一的開源框架來完成Url重寫任務,今天我要介紹的就是UrlRewriteFilter,它使用起來比較簡單。 UrlRewriteFilter是用來改寫URL的Web過濾器,類似Apache的mod_rewrite。適用於任何Web應用伺服器(如Resin,Orion,Tomcat等)。其典型應用就把動態URL靜態化,方便搜尋引擎爬蟲抓取你的動態網頁。
我們先簡單的了解一下使用Url重寫能為你網站帶來哪些好處。
第一:有利於搜尋引擎的抓取,因為現在大部分的搜尋引擎對動態頁面的抓取還比較弱,它們更喜歡抓取一些靜態的頁面。而我們現在的頁面大部分的資料都是動態的顯示的。這就需要我們把動態頁面變成靜態的頁面,有利於搜尋引擎的抓取。
第二:讓使用者更容易理解,很少有使用者去關心你網站的頁面的地址,但對一般的大中型網站增強可讀性還是必須的。這樣會讓你的網站更完美。
第三:隱藏技術的實現,我們可以透過Url重寫可以實現技術的隱藏。不致於暴露你所採用的技術,給一些想攻擊你網站的愛好者提供方便。
第四:可以很方便的重複使用,提升網站的移植性。如果我們後台方法改動的話,可以確保前台的頁面部分不用改。這樣就提高了網站的移植性。
它雖然有這麼多的優點,但是也有一點缺點的,因為它是透過過濾器原理來實現的,就以為著又多了一道訪問,會多少影響點訪問速度的,這個可以忽略不計的。
現在UrlRewriter技術有兩個技術平台的,一個是在Java方向的,另一個就是.NET方向的。今天我們講的是Java方向的應用。
首先讓我們了解它的工作原理,說白了它就是一個簡單的過濾器(Filter),看看源碼你就會很快的明白,它就是透過我們在jsp中常用的兩個方法實現的forward() ,sendRedirect()。
下面我們就Url重寫技術進行簡單應用:
第一步:下載urlrewrite-3.2.0beta.jar包,並把urlrewrite-3.2.0beta.jar拷到classpath下。
第二步:在WEB-INF目錄下建立一個urlrewrite.xml設定檔。
第三步:在web.xml設定檔中初始化配置UrlRewriteFilter。在設定檔中加上下面的程式碼:
複製代碼代碼如下:
<!-- 在設定檔中設定URL Rewrite-->
<FILTER></FILTER>
<FILTER-NAME></FILTER-NAME>UrlRewriteFilter
<FILTER-CLASS></FILTER-CLASS>
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
<FILTER-MAPPING></FILTER-MAPPING>
<FILTER-NAME></FILTER-NAME>UrlRewriteFilter
<URL-PATTERN></URL-PATTERN>/*
<DISPATCHER></DISPATCHER>REQUEST
<DISPATCHER></DISPATCHER>FORWARD
最後要簡單的講一下常用的兩個設定規則,以下就是簡單的urlrewrite.xml設定片段。不要習慣Java的命名法把它寫成urlRewrite.xml,這樣即使你加上
複製代碼代碼如下:
<INIT-PARAM></INIT-PARAM>
<PARAM-NAME></PARAM-NAME>confPath
<PARAM-VALUE></PARAM-VALUE>/WEB-INF/urlRewrite.xml
在啟動的伺服器的時候還是會報錯的,因為原始碼中必須是全小寫的(urlrewrite.xml)且只能放到WEB-INF下面。
<!--l version="1.0" encoding="utf-8-->
<URLREWRITE></URLREWRITE>
<!-- 顯示主題帖-->
<RULE></RULE>
<FROM></FROM>^/forum/thread/([0-9]+).html$
<TO type="forward"></TO>/forum/list.action?id=$1
<RULE></RULE>
<FROM></FROM>^/forum/thread/([0-9]+).html?page=([0-9]+)$
<TO type="forward"></TO>/forum/list.action?id=$1&page=$2
所有的規則配置都寫在這裡。第一個常用個規則就是站內的簡單重寫。
<rule>
<from></from>
<to type="forward></to>
</rule>
<from></from>
寫上你自己定義的存取位址,通常會採用正規表示式的寫法;<to type="forward></to>就是實際的存取位址。例如我們實際的存取位址是: http://www.phome.asia/forum/list.action?id=16931&page=2而我們想把它重寫為http://www.phome.asia/forum/thread/16931.html?page=2 。 這樣看起來比我們實際的要好看的多。
複製代碼代碼如下:
<RULE></RULE>
<FROM></FROM>^/forum/thread/([0-9]+).html?page=([0-9]+)$
<TO type="forward"></TO>/forum/list.action?id=$1&page=$2
簡單的介紹一下常用的正規表示式:
程式碼說明
. 匹配換行符以外的任意字符
/w 匹配字母或數字或底線或漢字
/s 符合任意的空白符
/d 匹配數字
/b 匹配單字的開始或結束
^ 匹配字串的開始
$ 匹配字串的結束常用的&要用&來表示。 $1,$2代表與你配置正規表達式>/(/w+)/(/w+)/相對應的參數。 <to type="forward">預設的是type="forward"。
另一個常用的規則就是連結外部的網站。就要用到<to type="redirect">。
複製代碼代碼如下:
<RULE></RULE>
<FROM></FROM>^/rss/yahoo/.html$
<TO type="redirect"></TO> http://add.my.yahoo.com/rss? url= http://feed.feedsky.com/ MySiteFeed