為兼顧動態數據實時性與搜索引擎友好性,UrlRewrite(URL 重寫)技術應運而生。本文深度解析其原理、優缺點、主流框架選型及 UrlRewriteFilter 實戰配置。
| 優勢 | 說明 |
|---|---|
| 搜索引擎友好 | 靜態化 URL 更易被爬蟲抓取收錄,提升 SEO 效果 |
| 用戶體驗提升 | 語義化 URL(如 /article/123.html)易讀、易記、易分享 |
| 技術架構隱藏 | 隱藏後端技術棧(如 .jsp、.action),降低安全風險 |
| 遷移重構友好 | 後端接口變更時,前端 URL 保持不變,提升系統可維護性 |
UrlRewriteFilter 本質是一個 Servlet Filter,攔截請求後通過 forward()(內部轉發)或 sendRedirect()(外部重定向)實現 URL 重寫,類似 Apache mod_rewrite。
<dependency>
<groupId>org.tuckey</groupId>
<artifactId>urlrewritefilter</artifactId>
4.0.4
</dependency>
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>confPath</param-name>
<param-value>/WEB-INF/urlrewrite.xml</param-value> <!-- 必須全小寫 -->
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<urlrewrite>
<!-- 站內轉發:正則捕獲組 $1、$2 對應 to 中引用 -->
<rule>
<from>^/forum/thread/([0-9]+)\.html$</from>
<to type="forward">/forum/list.action?id=$1</to>
</rule>
<rule>
<from>^/forum/thread/([0-9]+)\.html\?page=([0-9]+)$</from>
<to type="forward">/forum/list.action?id=$1&page=$2</to>
</rule>
<!-- 外部重定向 -->
<rule>
<from>^/rss/yahoo\.html$</from>
<to type="redirect">https://add.my.yahoo.com/rss?url=https://feed.feedsky.com/MySiteFeed</to>
</rule>
</urlrewrite>
| 元字符 | 含義 |
|---|---|
. | 匹配除換行符外任意字符 |
\w | 匹配字母、數字、下劃線、漢字 |
\d | 匹配數字 [0-9] |
\s | 匹配空白符 |
^ | 匹配字符串開始 |
$ | 匹配字符串結束 |
() | 捕獲組,對應 $1、$2... |
urlrewrite.xml(全小寫),放置於 WEB-INF 目錄下& 必須寫為 &type="forward" 為默認,可省略;外部跳轉需顯式指定 type="redirect"REQUEST 和 FORWARD 確保轉發鏈路生效/users/123/profile → /userProfile.action?userId=123/en/product/456 → /productDetail.action?id=456&lang=en/static/v20240115/app.js → /static/app.js?v=20240115Filter 方式會增加一層攔截開銷,但通常在微秒級,可忽略不計。高並發場景建議:
UrlRewriteFilter 配置簡單、功能強大,是 Java Web 專案實現偽靜態的首選方案。合理規劃 URL 規則,能顯著提升網站 SEO 效果與用戶體驗。