使用 Tuckey 讓舊版 Tomcat 也能 URLRewrite
這篇是小蛙犯蠢得到的結果,做都做了就順便記錄下來。
手邊得到一個需求是在 tomcat 下進行改寫網址的功能,也就是把
https://www.abc.com/def/ijk.jsp?type=xyz
改寫成這種漂亮的
https://www.abc.com/def/xyz
啟用 Tuckey 步驟
大概搜尋了一下之後發現 Tomcat 8.0 以下沒有辦法直接使用 urlrewrite 功能,只好用 tuckey 來做 urlrewrite 功能,跟著 官方文件 做就可以完成了,這邊小蛙還是大概記錄一下。
1. 到 Tuckey 官方文件,點選 Download 下載 urlrewritefilter-4.0.3.jar
2. 將該 jar 放在 tomcat_project/WEB-INF/lib/ 資料夾中
3. 編輯 WEB-INF/web.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> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
4. 建立 WEB-INF/urlrewrite.xml,可直接下載範例:urlrewrite.xml
5. 重新啟動 tomcat 就完成了
URLRewrite 設定範例
重啟 tomcat 沒有出現錯誤的話,就表示已經安裝成功,可以開始在urlrewrite.xml
檔案中添加自己的規則了,上面下載的官方範例檔或官方說明文件中已經列出幾種常用的範例,以下僅節錄部份:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN" "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd"> <urlrewrite> <rule> <note> The rule means that requests to /test/status/ will be redirected to /rewrite-status the url will be rewritten. 概念就是從 from 對應到 to,如果有 redirect 就會重新導向,瀏覽器上面的網址會變 </note> <from>/test/status/</from> <to type="redirect">%{context-path}/rewrite-status</to> </rule> <rule> <note> Redirect one url,重新導向一個頁面 </note> <from>/some/old/page.html</from> <to type="redirect">/very/new/page.html</to> </rule> <rule> <note> Redirect a directory,重新導向一個資料夾 </note> <from>/some/olddir/(.*)</from> <to type="redirect">/very/newdir/$1</to> </rule> <rule> <note> Clean a url,清理 URL eg, /products/1234 will be passed on to /products/index.jsp?product_id=1234 without the user noticing. </note> <from>/products/([0-9]+)</from> <to>/products/index.jsp?product_id=$1</to> </rule> </urlrewrite>
清理 URL 設定
小蛙這邊希望做的事情是把上面提到的好看的網址,內部轉到有網頁名稱( xxx.jsp )跟問號( ? )的網址,對使用者來說是輸入好看的網址,醜的網址由 tuckey 內部處理對應關係隱藏起來。以小蛙的例子來說,原本的網址是https://abc.com/web/javascripts/pdfjs/viewer.jsp?f=106project
,那小蛙接到的需求是希望能簡化成https://abc.com/web/project
,所以外部連進來是沒有問號的好看的網址,而內部對應維有問號的網址,因此設定寫成:
<rule> <from>^/web/([0-9a-zA-Z_]+)$</from> <to>/web/javascripts/pdfjs/viewer.jsp?f=$1</to> </rule>
其中$1
會替換成 from 中 () 內的內容,至於為什麼文章一開頭會說小蛙犯蠢呢?因為小蛙的同事劈頭就問了,那台伺服器上面不是有 nginx 嗎?直接用 nginx 導向就好了 … ㄜ ~ 一點也沒錯,用 nginx 反而簡單些 … Tuckey 附的範例檔在小蛙需要的 Clean a url 的例子中,一直設定不起來,小蛙找了好久才發現,範例文件 from 部份寫/prodocts/([0-9]+)
,但在新版的文件中的範例卻是^/products/([0-9]+)
,在前面多加一個^
就可以正常運作了