首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

URL 重寫三大實現方案總結:Filter、Apache Mod_Rewrite、404 回退

     編輯:Java 相關知識

URL 重寫將 /viewthread.jsp?id=1234 轉為搜尋引擎友善的 /viewthread/1234.htm。以下為三種主流方案優劣對比:

方案一:Servlet Filter(如 Tuckey UrlRewriteFilter)

<!-- 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>
</filter-mapping>
<!-- urlrewrite.xml -->
<urlrewrite>
  <rule>
    <from>/viewthread/(\d+).htm$</from>
    <to>/viewthread.jsp?id=$1</to>
  </rule>
</urlrewrite>
  • ✅ 純 Java,跨容器可攜
  • ✅ 規則熱加載支援(部分配置)
  • ❌ 修改規則需重新部署或重啟應用
  • ❌ 所有請求經 Filter 鏈,微小效能開銷

方案二:Apache httpd mod_rewrite

# httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so

<VirtualHost *:80>
  RewriteEngine On
  RewriteRule ^/viewthread/(\d+).htm$ /viewthread.jsp?id=$1 [L,PT]
</VirtualHost>
  • ✅ 效能極高(C 模組,核心層處理)
  • ✅ 修改規則只需 apachectl graceful 秒級生效,無需重啟 Java 容器
  • ✅ 可集中管理多個後端應用的重寫規則
  • ❌ 需額外維護 Apache,增加部署複雜度
  • ❌ 正則語法與 Java 略有差異,調試較難

方案三:404 錯誤頁面回退(Application 級處理)

<!-- web.xml -->
<error-page>
  <error-code>404</error-code>
  <location>/rewrite-handler.jsp</location>
</error-page>
<%-- rewrite-handler.jsp --%>
<%
  String requestUri = request.getRequestURI();
  if (requestUri.matches("/viewthread/\\d+\\.htm")) {
      String id = requestUri.replaceAll("/viewthread/(\\d+)\\.htm", "$1");
      request.setAttribute("id", id);
      request.getRequestDispatcher("/viewthread.jsp").forward(request, response);
  } else {
      response.sendError(404);
  }
%>
  • ✅ 完全在應用層控制,邏輯最靈活(可查資料庫、動態生成)
  • ✅ 無額外基礎設施依賴
  • ❌ 觸發 404 會污染存取日誌、監控指標
  • ❌ 效能最差(經完整 Servlet 生命週期兩次)
  • ❌ 搜尋引擎可能誤判為真 404

選型建議

場景推薦方案
穩定上線系統,規則固定方案一
規則頻繁變動、追求極致效能、已有 Apache 前端方案二
原型驗證、簡單應用、需極度動態邏輯方案三

結語

無銀彈,根據團隊運維能力、效能要求、規則變更頻率在三者間取捨。生產環境首選方案一或二,方案三僅作臨時或極簡場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved