注:本文檔基本3.2.0版本。原文請參閱:http://tuckey.org/urlrewrite/manual/3.2/index.html
手冊
社區支持請訪問: urlrewrite谷歌小組 。
閱讀 使用示例 和 ant任務 報告。如果你有任何找反饋,或者你想分享給大家的配置,可以 郵件我們 ,如果有任何建議和使用示例,請將它們提交到 urlrewrite谷歌小組論壇 。
安裝
- 下載zip(或tar.gz)並將解壓到你的上下文目錄中,比如把urlrewrite.xml放到WEB-INF目錄下。
- 把下面的代碼添加到WEB-INF/web.xml中(儘量放置到servlet配置的上方)(詳見過濾器參數部分)
<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> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
- 把你的配置添加到WEB-INF/urlrewrite.xml中
- 重啓服務。
你可以訪問 http://127.0.0.1:8080/rewrite-status 查看配置輸出。
過濾器參數(Filter Parameters)
下面列出了一些高級選項,如重新加載配置等。各個選項都有解釋。
<?xml version="1.0" encoding="UTF-8"?>
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
</filter-class>
<!-- 設置配置文件重新加載的間隔時間,以秒計,必須是一個合法的整數(0表示每次修改都檢查,-1表示不做重新加載檢查,默認爲-1) -->
<!-- 源碼中默認值爲0 -->
<init-param>
<param-name>confReloadCheckInterval</param-name>
<param-value>60</param-value>
</init-param>
<!-- 如果需要求給配置文件的路徑,可以通過confPath參數,路徑相對於上下文跟目錄(默認爲/WEB-INF/urlrewrite.xml) -->
<init-param>
<param-name>confPath</param-name>
<param-value>/WEB-INF/urlrewrite.xml</param-value>
</init-param>
<!-- 設置日誌級別,可選值爲 TRACE, DEBUG, INFO(默認), WARN, ERROR, FATAL; 日誌系統可選 log4j,
commons, slf4j; -->
<init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
<!-- 你可以修改urlrewrite狀態數據的目錄,以便它不與你已部署的應用相沖突(注:默認爲/rewrite-status) ,注:必須以/開頭 -->
<init-param>
<param-name>statusPath</param-name>
<param-value>/status</param-value>
</init-param>
<!-- 可以禁用狀態頁面,可選值爲true/false,(默認爲true) -->
<init-param>
<param-name>statusEnabled</param-name>
<param-value>true</param-value>
</init-param>
<!-- 你可能想允許其他的host也可以看到狀態頁,可以用statusEnabledOnHosts參數來配置,值爲,隔開的host列表,可使用*號通配符(默認爲"localhost,
local, 127.0.0.1") -->
<init-param>
<param-name>statusEnabledOnHosts</param-name>
<param-value>localhost, dev.*.myco.com, *.uat.mycom.com
</param-value>
</init-param>
<!-- 默認false. 使用mod_rewrite風格的配置文件(若設置爲true,則confPath沒有被指定時會會設置爲/WEB-INF/.htaccess) -->
<init-param>
<param-name>modRewriteConf</param-name>
<param-value>false</param-value>
</init-param>
<!-- 從參數modRewriteConfText中加載mod_rewrite風格的配置信息,注:如果調協這了個參數,其他的默認參數將被忽略
<init-param>
<param-name>modRewriteConfText</param-name>
<param-value>
RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]
RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]
</param-value>
</init-param>
-->
<!-- 默認爲false, 允許通過訪問下面的url設置使用哪個配置文件/rewrite-status/?conf=/WEB-INF/urlrewrite2.xml。僅爲測試方便而設計
<init-param>
<param-name>allowConfSwapViaHttp</param-name>
<param-value>false</param-value>
</init-param>
-->
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
注:設置logLevel爲log4j或者commons將導致日誌構建時調用log4j或commons-loggin類庫。因此,需要把相關jar引入到classpath中。
配置文件 WEB-INF/urlrewrite.xml
一個簡單的配置文件如下所示,把它放置到WEB-INF下面,並命名爲urlrewrite.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://www.tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<rule>
<from>^/some/olddir/(.*)$</from>
<to type="redirect">/very/newdir/$1</to>
</rule>
<rule match-type="wildcard">
<from>/blog/archive/**</from>
<to type="redirect">/roller/history/$1</to>
</rule>
</urlrewrite>
urlrewrite.xml文件必須名爲"urlrewrite.xml"的根節點,並且必須有至少一個rule元素。
rule節點必須包含一個from和一個to,可以有0或多個condition元素,並且可以有0或多個set元素。
當一個rule處理進來的請求時,所有的condition都會被執行,然後from將嘗試與請求URL進行匹配,由to和from指定模式生成最終的URL,只要該rule匹配上了,set即會被執行。
當執行rule時,過濾器將會對所有的rule進行一個非常簡單的循環,對每個rule執行如下僞代碼所未的動作
Pattern.compile(<from> element);
pattern.matcher(request url);
matcher.replaceAll(<to> element);
if ( <condition> elements match && matcher.find() ) {
handle <set> elements (if any)
execute <run> elements (if any)
perform <to> element (if any)
}
3.1 <urlrewrite>元素
頂級元素。
屬性 | 取值 | 解釋 |
default-match-type(可選) | regex(默認) | 所有的rule和condition都會使用Java正則表達式引擎(除非在某個rule上指定了match-type) |
wildcard | 所有的rule和condition都會使用通配符表達式引擎(除非在某個rule上指定了match-type ) | |
decode-using(可選) | header,utf-8(默認) | 如果URL解碼時將使用request.getCharacterEncoding(),如果返回值爲空,則使用UTF-8 |
null | 不解碼 | |
header | 只使用request.getCharacterEncoding()解碼 | |
[encoding] |
僅使用指定編碼去解碼,如ISO-8859-1。到 Java Charset Object 查看所有的編碼。 |
|
header,[encoding] | 當URL解碼時使用request.getCharacterEncoding() 解碼,如果爲空,使用指定的編碼去解碼。 | |
use-query-string(可選) | false(默認) | 查詢參數不使會加到from中的url上。 |
true | 查看參數添加到from的url上。 | |
use-context(可選) | false(默認) | 上下文路徑不會被添加到from的url上。 |
true | 上面文件路徑會被添加到from的url上。 |
3.2 <rule>元素
零個或多個,規則的基礎組件。
屬性 | 取值 | 解釋 |
enabled(可選) | true(默認) | 啓用該規則 |
false | 禁用該規則 | |
match-type(可選) | regex(默認) | 該rule和condition都會使用Java正則表達式引擎 |
wildcard | 該rule和condition使用通配符表達式引擎 |
下面的示例,請求/world/usa/nyc會被分發到/world.jsp上
<rule match-type="regex">
<from>^/world/([a-z]+)/([a-z]+)$</from>
<to>/world.jsp</to>
</rule>
<rule match-type="wildcard">
<from>/world/*/*</from>
<to>/world.jsp</to>
</rule>
3.3 <outbound-rule> 元素
零或多個。相對於通用的規則來說,這個很簡單,只是它通過response.encodeURL()用來重寫url。
屬性 | 取值 | 解釋 |
enabled(可選) | true(默認) | 啓用該規則 |
false | 禁用該規則 | |
encodefirst(可選) | false (默認) | 運行該規則後,執行encodeURL |
true | 運行該規則之前,執行encodeURL |
可以包含 run、from、to 和 set元素,例如:
<outbound-rule>
<from>^/world.jsp?country=([a-z]+)&city=([a-z]+)$</from>
<to>/world/$1/$2</to>
</outbound-rule>
使用上面的示例,下面的jsp代碼:
<a href="<%= response.encodeURL("/world.jsp?country=usa&city=nyc") %>">nyc</a>
將會輸出爲:
<a href="/world/usa/nyc">nyc</a>
或者使用JSTL標籤
<a href="<c:url value="/world.jsp?country=${country}&city=${city}" />">nyc</a>
將會輸出爲:
<a href="/world/usa/nyc">nyc</a>
注:如果使用JSTL,也好使。
3.4 <name> 元素
這也是一個可選元素,用於標識規則的名稱。可以用於rule和outbound-rule。
<rule>
<name>World Rule</name>
<from>^/world/([a-z]+)/([a-z]+)$</from>
<to>/world.jsp?country=$1&city=$2</to>
</rule>
3.5 <note>元素
這個簡單的可選元素,用於描述某個規則。可用於rule和outbound-rule。
<rule>
<name>World Rule</name>
<note>
Cleanly redirect world requests to JSP,
a country and city must be specified.
</note>
<from>^/world/([a-z]+)/([a-z]+)$</from>
<to>/world.jsp</to>
</rule>
3.6 <condition>元素
提供給你爲某個規則選擇條件的元素。規則的所有條件必須都必須被滿足(除非or上顯示設置了next)。取值可以是正則表達式。
屬性 | 取值 | 解釋 |
類型(可選) | header(默認) | 如果選擇這個類型,頭名稱必須用name屬性來指定 |
method | 請求的方式,如GET、POST、HEAD等 | |
port | 正在運行的web應用服務的端口 | |
time | 服務端的當前 時間。(取值爲自1970-01-01 00:00:00開始的秒數,或者unix時間),即(new Date().getTime())。這可能用於確定內容只在你設置的時間點生效。 | |
year | 服務器當前年份。即 (Calendar.getInstance()).get(Calendar.YEAR) | |
month | 服務器當前月份。一月是0。即(Calendar.getInstance()).get(Calendar.MONTH) | |
dayofmonth |
服務器一月中的第幾天。3月份第一天是1.即 |
|
dayofweek |
服務器周的第幾天。週六是1,週日是7。即 |
|
ampm |
服務器端上午還是下午,即 |
|
hourofday |
服務器端一天中的第幾小時(24小時制),下午10點是22,即 |
|
minute |
服務端當前時間的分鐘字段,即 |
|
second |
服務端當前時間的秒鐘字段,即 |
|
millisecond | 服務端當前時間的毫秒字段,即 (Calendar.getInstance()).get(Calendar.MILLISECOND) |
|
attribute | 將會檢查request中arttribute中的值,(不要與parameter混淆),當使用該類型時,name必須設置。 即request.getAttribute([name]) |
|
auth-type | 將檢查request的驗證類型,即:request.getAuthType() | |
character-encoding | 當前請求的字符編碼,即 request.getCharacterEncoding() |
|
content-length | 請求的內容長度(可以讓你拒絕大請求),即request.getContentLength() | |
content-type | 請求的內容類型(可能不是很有用),即:request.getContentType() | |
context-path | 請求的上下文路徑,即:request.getContextPath() | |
cookie |
cookie的值,注:用該類型時name必須指定。即
|
|
parameter | 一個檢查查詢參數的更條理的方式,這將檢查GET或POST請求的參數,注:name必須指定。即:request.getParameter([name]) | |
path-info | 即:request.getPathInfo() | |
path-translated | 即:request.getPathTranslated() | |
protocol | 請求的協議,如HTTP/1.1。即:request.getProtocol() | |
query-string | 組成當前請求的查詢參數,如id=2345&name=bob,即:request.getQueryString() | |
remote-addr | 組成當前請求的客戶端IP地址,如123.123.123.123,即:getRemoteAddr() | |
remote-host | 組成當前請求的遠程主機名,如123qwdsl.att.com(注:這僅在你的應用服務器配置了獲取主機名時纔有效,多數沒有配置)。即:request.getRemoteHost() | |
remote-user | 如果用戶已通過驗證,該值表示請求的登錄用戶,即:request.getRemoteUser() | |
requested-session-id | 返回由客戶端指定的會話ID,如:2344asd234sada4 。即:request.getRequestedSessionId() | |
requested-session-id-from-cookie | sessionID是否來自於cookie,即:request.isRequestedSessionIdFromCookie() | |
requested-session-id-from-url | cookie是否來自來URL,即:isRequestedSessionIdFromURL() | |
requested-session-id-valid | cookie是否有效。即:request.isRequestedSessionIdValid() | |
request-uri | 返回請求url從協議名到查詢參數的一部分,HTTP請求的第一行。即:request.getRequestURI() | |
request-url | 重建客戶端請求的URL,返回的URL包含了協議、服務名、端口和路徑,但不包吃住查詢參數。即:request.getRequestURL() | |
session-attribute | (注:name必須設置),即:session.getAttribute([name]) | |
session-isnew | 會話是否是新的。即:session.isNew() | |
server-name | 服務端的主機名,哪個請求被髮送(來自於主機header而不是機器名),即request.getServerName(). | |
scheme |
請求使用的scheme,如http或https。 即:request.getScheme()
|
|
user-in-role |
該值不能是正則表達式。 即:request.isInRole([value])
|
|
name(可選) | 可以任何值 | 如果type是header,則該項用給定了name的http請求頭與運行值比較。 |
next(可選) | and(默認) | 下一個規則與該規則都匹配 |
or | 下一個規則或這個條件任一個匹配 | |
operator(可選) | equal(默認) | 相等,表示正則表達式匹配或值相等 |
notequal | 不等於,注:只有數值型都有效 | |
greater | 大於,注:只有數值型都有效 | |
less | 小於,注:只有數值型都有效 | |
greaterorequal | 大於或等於,注:只有數值型纔有效 | |
lessorequal | 小於或等於,注:只有數值型纔有效 |
示例:
<condition name="user-agent" operator="notequal">Mozilla/[1-4]</condition>
<condition type="user-in-role" operator="notequal">bigboss</condition>
<condition name="host" operator="notequal">www.example.com</condition>
<condition type="method" next="or">PROPFIND</condition>
<condition type="method">PUT</condition>
3.7 <from>元素
每個rule或outbound-rule都必須有from元素。取可以是個正則表達式,注:from的url是相對上下文路徑。
屬性 | 取值 | 解釋 |
casesensitive(可選) | false(默認) | 大小寫不敏感 |
true | 大小寫敏感 |
示例:
<from>^/world/([a-z]+)$</from>
3.8 <to>元素
值可以是正則替換表達式。
屬性 | 取值 | 解釋 |
type(可選) | forward(默認) |
如果請求匹配了rule上的conditions,則from上指定的url將內部跳轉至to元素指定的url上,注:to上的url的上下文必須與from的相同。與下面的代碼效果相同: RequestDispatcher rq = request.getRequestDispatcher([to value]); |
passthrough | 與forward相同 | |
redirect |
請求匹配上了condition,則from的url將重定向至to指定的url。與下面的代碼效果相同: HttpServletResponse.sendRedirect([to value])) |
|
permanent-redirect |
與下面代碼相同: response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); (注:SC_MOVED_PERMANENTLY是HTTP狀態碼,值爲301) |
|
temporay-redirect |
與下面代碼相同: response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); (注: SC_MOVED_TEMPORARILY是HTTP狀態碼,值爲302) |
|
pre-include | ||
post-include | ||
proxy | 請求將被代理到指定的完整url上,當使用該特性時,必須把common-http和commons-codec放到類路徑當中。 | |
last(可選) | false(默認) | 如果這個rule成功,則剩餘的rule也會被處理。 |
true | 如果這個rule匹配上,則剩餘的rule不再處理了。 | |
encode(可選) | false(在rule中爲默認) | response.encodeURL([to])不會被執行 |
true(在outbound-rule中爲默認) | 在to元素指定的url進行重定向之前,執行response.encodeURL([to]) | |
context(可選) |
如果應用服務端配置了允許“cross context”通訊,則該屬性可以用於forward(僅僅是forward,而不是重定向或其的to類型)請求到一個指定名稱的servlet上下文。 在Tomcat中,對一個實例,應用上下文在服務項配置(server.xml或context.xml)需要一個可選項crossContext="true"。對實例,前面提到的兩個應用要定義成下面的樣式: <Context docBase="app" path="/app" reloadable="true" crossContext="true"/> <Context docBase="forum" path="/forum" reloadable="true" crossContext="true"/> |
注:"to"元素的值可以爲null,例如<to>null</to>,意思是如果該rule匹配後,請求不會繼續往後走了,即該fileter將不調用chain.doFilter。
如果"to"元素被設置爲-,則沒有適當的url被替換,請求還會像原生一樣,就像沒發生任何事一樣。即該filter將調用chain.doFilter