一、背景
公司的門戶資訊網站的需求:對所有的靜態頁面做301 重定向(seo 提出的),例如:輸入abc.com 能夠重定向到 www.abc.com,輸入abc.com/news 能夠重定向到www.abc.com/news。
二、301 重定向簡介
1. 首先要明白什么是重定向?
提到重定向我第一時間想到的是轉發,因為這兩者經常被拿到一起來做比較,也是我們在面試過程中經常被提到的一個問題。那么什么是重定向和轉發?他們的區別又是什么?
簡單來說,他們都是servlet 的兩種請求方式
轉發:直接轉發方式(Forward),客戶端和瀏覽器只發出一次請求,Servlet、HTML、JSP或其它信息資源,由第二個信息資源響應該請求,在請求對象request中,保存的對象對於每個信息資源是共享的。
重定向:間接轉發方式(Redirect)實際是兩次HTTP請求,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。
他們的區別:
Forward 和Redirect 代表了兩種請求轉發方式:直接轉發和間接轉發。對應到代碼里,分別是RequestDispatcher 類的forward() 方法和HttpServletRequest 類的sendRedirect() 方法。
對於直接方式,客戶端瀏覽器只發出一次請求,Servlet把請求轉發給Servlet、HTML、JSP 或其它信息資源,由第2個信息資源響應該請求,兩個信息資源共享同一個request 對象。
對於間接方式,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL 發出請求,從而達到轉發的目的。它本質上是兩次HTTP 請求,對應兩個request 對象。
(詳細介紹可以查看JAVA常見面試題之Forward和Redirect的區別)
2. 301 重定向即頁面永久性移走(301重定向)是一種非常重要的“自動轉向”技術。網址重定向最為可行的一種辦法。當用戶或搜索引擎向網站服務器發出瀏覽請求時,服務器返回的HTTP數據流中頭信息(header)中的狀態碼的一種,表示本網頁永久性轉移到另一個地址。還有一個是302 重定向,也叫暫時性轉移(Temporarily Moved ),這里就不展開講述。
三、301 重定向使用場景
1. 網站更換域名時,通過301永久重定向將舊域名重定向至新域名,挽回流量損失和SEO。
2. 當出於需要刪除網站中的某些目錄時,比如我要刪除我博客下的博客導航,這時就可以用301永久重定向到網站首頁。
3. 如果你有多個閑置域名時需要指向同一網站時,通過301永久重定向可以實現。
4. 你打算實現網址規范化(就是我們現在的需求)。
四、301 重定向的實現
1. 通過java通過Filter過濾器實現html靜態文件301重定向,該方法需要自己寫邏輯判斷,拼接出需要重定向的url 值,再做301 重定向。
2. 偽靜態urlrewrite,即使用Url Rewrite 進行URL 重寫來實現網站的偽靜態。
這里我們詳細解釋一下方法2,偽靜態urlrewrite,它主要用到的是一個urlRewriteFilter 用於改寫URL的Web過濾器。類似於Apache的mod_rewrite。適用於任何Web應用服務器(如Tomcat,jboss,jetty,Resin,Orion等)。其典型應用就把動態URL靜態化,便於搜索引擎爬蟲抓取你的動態網頁。
第一步:下載urlrewrite jar 包,放到web-info的lib目錄中,我這里直接利用mavan 進行管理,在pom.xml 文件中添加
<dependency> <groupId>org.tuckey</groupId> <artifactId>urlrewritefilter</artifactId> <version>4.0.4</version> </dependency>
第二步:編輯WEB-INF/web.xml 在其它servlet mapping前加入
<!-- html 301 請求監聽 --> <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>
第三步:配置urlrewrite.xml 文件,添加跳轉規則
<urlrewrite> <rule> <name>seo redirect 301</name> <condition name="host" operator="equal">^abc.com$</condition> <from>^/(.*)</from> <to type="permanent-redirect" last="true">http://www.abc.com/$1</to>; </rule> </urlrewrite>
詳細的標簽說明可以查閱官網文檔 http://tuckey.org/urlrewrite/manual/3.0/index.html#install
(另外說一下,項目之前有要求說增加多域名訪問,最開始的做法是在 server.xml 文件中多增加一個<Alias>abc.com</Alias>。但是做了301 重定向的實現 之后發現這個可以去掉。)