這篇是小蛙犯蠢得到的結果,做都做了就順便記錄下來。

手邊得到一個需求是在 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

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *