使用 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]+),在前面多加一個^就可以正常運作了

參考資料

1. URLRewrite in Tomcat 7
2. UrlRewriteFilter 4.0.3

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

    這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料