Part 1: 用途(我本身總結下,起碼有如下這2個用途)php
用途1: 隱藏你的具體技術實現html
好比你發佈站點時候,若是寫的 http://host.com/page1.jsp?a=3&b=8 ,別人一看就知道你用的jsp實現,或者你用的 http://host2.com/page2.php,人家一看就知道你用的php的實現,可是若是你用URL重寫讓對外暴露的url爲 http://host.com/page1_3_8.html ,那麼誰能知道你內部用什麼技術語言實現的呢?web
用途2:站點優化,尤爲搜索引擎優化,不帶參數的地址更容易被網絡爬蟲搜索到。正則表達式
好比 http://host.com/page1_3_8.html 就比 http://host.com/page1.jsp?a=3&b=8 更容易被網絡爬蟲搜索到,也容易被百度,google, bing 搜到服務器
Part2 : 咱們如何讓這個目的變成現實呢?
方法是,在web.xml中定義一個過濾器,而後過濾器裏面會加載WEB-INF/urlrewrite.xml ,而後再urlrewrite.xml裏面定義映射規則。(外網訪問地址->內部地址)jsp
你們都知道,當服務器解析web.xml時,會按照如下順序:context-param -> listener -> filter -> servlet ,因此過濾器是在servlet以前解析出的,也就是在全部頁面以及充當控制器的servlet實例化以前就有了。
而後咱們解讀UrlRewriteFilter類(由於Filter用於攔截請求,因此在請求發送到具體頁面以前已經被過濾了,也就是被這些映射規則所適用過了)優化
能夠看出,在載入UrlRewriter時候,會去讀confPath所表明的重寫映射文件,而這個重寫映射文件confPath定義爲搜索引擎
也就是要麼指定一個,不然就是取拿DEFAULT_MOD_REWRITE_STYLE_CONF_PATH,若是拿不到就拿DEFAULT_WEB_CONF_PATH。
- public static final String DEFAULT_MOD_REWRITE_STYLE_CONF_PATH = "/WEB-INF/.htaccess";
- public static final String DEFAULT_WEB_CONF_PATH = "/WEB-INF/urlrewrite.xml";
因此,咱們Canton例子中,最終就會讀/WEB-INF/urlrewrite.xml裏面定義的各類重寫映射規則。
Part 3:深刻解讀映射文件 urlrewrite.xml
全部的重寫規則都定義在urlrewrite.xml,並且每一個規則都對應 一個rule 元素,每一個rule元素應該有這樣的結構
<rule>
<from> 用正則表達式寫出的外網訪問地址,通常用html後綴來屏蔽具體技術實現細節</from>
<to>用位置參數給出的內網頁面url,能夠變爲你的內部實現,好比jsp頁面就用.jsp擴展名</to>
</rule>
例如
- <rule>
- <from>^/(\d+)/(\d+)/page_(\d+)\.html$</from>
- <to>/$1.jsp?category=$2&page=$3</to>
- </rule>
這個例子中,咱們能夠看到,from 是^/(\w+)/(\w+)/page_(\d+)\.html$ ,這是一個正則表達式,^,$是首尾界定符,因此它表示,訪問一個
/一個或多個數字(位置1)/一個或多個數字(位置2)/page_一個或多個數字(位置3).html 的請求,把他映射到什麼內部請求呢?
第一個位置的數字放$1,第二個數字的位置放$2,第三個數字的位置放$3 。 【 & 是 &的轉義字符】
因此,加入某個請求是 http://host.com/22/33/page_444.html ,則不難發現,第一個位置參數值爲22,第二個位置參數值爲33,第三個位置參數值爲444
因此,系統將其轉爲內部的 http://host.com/22.jsp?category=33&page=444
Part 4: 參考資料
能夠網上搜下關於 「僞」靜態,站點優化,搜索引擎優化的相關知識就明白了。