URL 重寫將 /viewthread.jsp?id=1234 轉為搜尋引擎友善的 /viewthread/1234.htm。以下為三種主流方案優劣對比:
<!-- 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>
# httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost *:80>
RewriteEngine On
RewriteRule ^/viewthread/(\d+).htm$ /viewthread.jsp?id=$1 [L,PT]
</VirtualHost>
apachectl graceful 秒級生效,無需重啟 Java 容器<!-- 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);
}
%>
| 場景 | 推薦方案 |
|---|---|
| 穩定上線系統,規則固定 | 方案一 |
| 規則頻繁變動、追求極致效能、已有 Apache 前端 | 方案二 |
| 原型驗證、簡單應用、需極度動態邏輯 | 方案三 |
無銀彈,根據團隊運維能力、效能要求、規則變更頻率在三者間取捨。生產環境首選方案一或二,方案三僅作臨時或極簡場景。