一、301/302
1、什么是301轉向?什么是301重定向?
301轉向(或叫301重定向,301跳轉)是當用戶或搜索引擎向網站服務器發出瀏覽請求時,服務器返回的HTTP數據流中頭信息(header)中的狀態碼的一種,表示本網頁永久性轉移到另一個地址。
2、什么是302重定向?
302重定向又稱之為302代表暫時性轉移(Temporarily Moved ),英文名稱:302 redirect。 也被認為是暫時重定向(temporary redirect),一條對網站瀏覽器的指令來顯示瀏覽器被要求顯示的不同的URL,當一個網頁經歷過短期的URL的變化時使用。一個暫時重定向是一種服 務器端的重定向,能夠被搜索引擎蜘蛛正確地處理。
3、301重定向與302重定向的區別
302重定向是暫時的重定向,搜索引擎會抓取新的內容而保留舊的網址。因為服務器返回302代碼,搜索引擎認為新的網址只是暫時的。
301重定向是永久的重定向,搜索引擎在抓取新內容的同時也將舊的網址替換為重定向之后的網址。
4、為什么302 重定向和網址劫持有關聯
從網址A 做一個302 重定向到網址B 時,主機服務器的隱含意思是網址A 隨時有可能改主意,重新顯示本身的內容或轉向其他的地方。大部分的搜索引擎在大部分情況下,當收到302 重定向時,一般只要去抓取目標網址就可以了,也就是說網址B。如果搜索引擎在遇到302 轉向時,百分之百的都抓取目標網址B 的話,就不用擔心網址URL 劫持了。問題就在於,有的時候搜索引擎,尤其是Google,並不能總是抓取目標網址。
比如說,有的時候A 網址很短,但是它做了一個302 重定向到B 網址,而B 網址是一個很長的亂七八糟的URL 網址,甚至還有可能包含一些問號之類的參數。很自然的,A 網址更加用戶友好,而B 網址既難看,又不用戶友好。這時Google 很有可能會仍然顯示網址A。由於搜索引擎排名算法只是程序而不是人,在遇到302 重定向的時候,並不能像人一樣的去准確判定哪一個網址更適當,這就造成了網址URL 劫持的可能性。也就是說,一個不道德的人在他自己的網址A 做一個302 重定向到你的網址B,出於某種原因, Google 搜索結果所顯示的仍然是網址A,但是所用的網頁內容卻是你的網址B 上的內容,這種情況就叫做網址URL 劫持。你辛辛苦苦所寫的內容就這樣被別人偷走了。
302 重定向所造成的網址URL 劫持現象,已經存在一段時間了。不過到目前為止,似乎也沒有什么更好的解決方法。在正在進行的數據中心轉換中,302 重定向問題也是要被解決的目標之一。從一些搜索結果來看,網址劫持現象有所改善,但是並沒有完全解決。
二、重定向/轉發
1、什么是重定向?
服務器向瀏覽器發送一個302狀態碼及一個Location消息頭(該消息頭的值是一個地址)。瀏覽器在收到之后,會立即向這個地址發送請求。
如果是按照通俗一點的按照流程里說就是這樣:發送請求 -->服務器處理請求-->響應請求,返回給瀏覽器一個新的地址與響應碼(302狀態 碼)-->瀏覽器根據響應碼(302狀態碼),判定該響應為重定向,自動發送一個新的請求給服務器,請求地址為之前返回的地址-->服務器運 行-->響應請求給瀏覽器
在編程的時候怎么寫:
response.sendRedirect(String url);很簡單的一句代碼就行了。但是有兩個問題是要注意的:
①重定向之前,不能夠有任何的輸出,否則會發生錯誤。
②重定向之前,會先清空response中緩存的數據。
特點是:
①重定向的地址是任意的。
②重定向之后,瀏覽器地址欄的地址會變成Location所指定的地址。
2、什么是轉發?
一個web組件(servlet/jsp) 將未完成的處理交給另外一個web組件繼續完成。
一般應用的場合:一個servlet處理請求之后,將處理結果交給一個jsp,讓jsp依據處理結果生成相應的界面。
如果是按照通俗一點的按照流程里說就是這樣:發送請求 -->服務器處理請求-->進行請求的重新設置,例如通過 request.setAttribute(name,value)-->根據轉發的地址,獲取該地址的jsp網頁-->響應請求給瀏覽器。
編程的時候怎么寫?這個比重定向要復雜一點:
① 將處理結果綁訂定到request對象上。
request.setAttribute(String name,Object obj);
//如果name對應的值不存在,則返回null。
Object request.getAttribute(String name);
request.removeAttribute(String name);
② 獲得轉發器
//uri:是要轉發的目的地,目的地只能是同一個應用的內部。
RequestDispatcher rd = request.getRequestDispatcher(String uri);
③ 轉發
rd.forward(request,response);
需要注意的是:
轉發之前,不要有任何的刷新操作,否則會出錯。
轉發之前,如果response當中緩存有數據,會先清空。
轉發的特點
① 轉發的目的地只能是同一個應用內部的各個組件之間。
② 轉發之后,瀏覽器地址欄的地址不會變。
綜合上面解說:總結下重定向和轉發的區別:
區別①:
重定向時,瀏覽器上的網址改變
轉發時,瀏覽器上的網址不變
區別②:
重定向實際上產生了兩次請求
轉發只有一次請求
區別③:
重定向的時候網址可以是任何的網址
轉發的網址只能是本站點的網址
根據上面的分析,所以說,用重定向和轉發不是一個習慣不習慣的問題,而是在什么情況下必須用的問題。