301跳轉與URL轉發
在購買域名時,域名本身是不帶有www的,但由于域名要通過DNS服務器解析后才可以使用,在這個過程中每一個域名是會指向一個web服務器ip地址,由于在很早之前網站方都會增加一個"www"的子域名來幫助客戶以更多的路徑訪問網站,客戶通常都會按照:"www.++.com"的形式來訪問站點;如果你沒有做這個www的解析那么"www.++.com"就不能訪問,對于不懂技術或者不明白解析的客戶來講,這個問題可能會造成他不能訪問你的站,因為他只是知道用帶有"www"的形式訪問你的站點,可能不知道"++.com"也是同樣可以訪問的!所以,后來也就有了更多人在延續這個做法;我們在購買空間域名時,服務商也會隨手就幫你做了這個"www"的解析,當然,這個解析的服務器地址是和沒有"www"相同的,造成:你用帶"www"的和不帶兩個域名同時可以訪問一個同樣的內容。說白了這個問題的答案就是:能夠讓初次使用互聯網的人更快的訪問進你的網站。
但是這樣的話,會分散某個域名的流量與PR值,最好是將所有訪問定向到某個域名下。
可以通過使用服務器技術實現的url轉發功能(url-forwarding 或 url redirect),轉發到帶www的域名來訪問。但是我們說到用這種url轉發方式是對seo不利的,對搜索引擎最友好的跳轉方式是使用301轉向(也叫301跳轉,301重定向)。
所以這里就有一些疑問了,為什么godaddy等域名注冊商提供的url轉發功能是不利于seo的?url轉發的原理是什么?如果要用301轉向,那么Linux apache, Windows IIS, php, ASP, ASP.NET, JSP 分別該如何設置來實現301重定向?
301重定向的作用
為什么要使用301轉向?首先第一條就是剛才我們提到的為了
seo優化,在如何url網址規范化中也提到,設置301轉向后,原來的頁面將返回301 HTTP 狀態碼給瀏覽器或者搜索引擎,告知搜索引擎次頁面已經永久重定向到了新的網頁上,spider就不會索引原網頁,同時也會將原網頁的PR權重傳遞給跳轉到的新網頁。如果返回的是302狀態碼,則告訴spider頁面跳轉只是臨時的,spider仍然會索引原網頁,這就造成了重復頁面問題(即Google 補充材料)。如www.facou.cn 302跳轉到yanet.cn,它們就會被當做兩個重復頁面。
其次,由于各種原因要更換域名時,可以使用301重定向將老域名301轉向到新的域名,這樣老域名的流量不會流失,PR權重也會轉移。另外當有注冊了多個不同域名,指向到同一網站時,也可以只設置一個主域名,將其他域名設置301轉向到主域名,這樣各個域名就不會分散權重。因此使用301轉向很有必要。
URL轉發的原理
url轉發有兩種方式,隱藏轉發和(url轉發后瀏覽器地址欄輸入的網址不變)不隱藏轉發(也叫顯性轉發:url轉發后地址欄顯示的地址為轉發后的網址)。有人測試過,不管是隱藏轉發還是不隱藏轉發,根據不同的域名注冊服務商,可能會返回不同的http header。有的域名服務商管理后臺設置的url轉發功能(URL Forwarding)會使服務器返回302狀態碼給搜索引擎,而不是301 http 狀態碼。
據說這類url轉發有的是通過給瀏覽器窗口套用一個框架iframe的方式來實現隱藏轉發,有的則是使用Javascript或Meta Refresh來實現不隱藏方式的url轉發,很少是真正用了301 重定向方法的。所以大家還是盡量少用url轉發功能,而是自己去手工設置實現301轉向。
如何實現301重定向
前面我們已經提到了很多關于WordPress等404頁面的設置方法。設置301重定向(301轉向,跳轉)的實現方法也有很多,下面根據不同的空間服務器類型和程序語言列出各種301重定向實現代碼,要參考的童靴請對號入座:
Linux 主機 Apache服務器 Mod-Rewrite 模式:通過.htaccess文件
當瀏覽器或搜索引擎spider發送一個頁面請求時,Web服務器就會檢查一個名為'.htaccess'的文件,這個文件指明了如何處理頁面請求,通過修改設置'.htaccess'文件就可以告知搜索引擎某個頁面是302轉向(臨時跳轉)還是301重定向(永久性跳轉)。有的Linux主機服務器還支持你在管理后臺直接設置301轉向。如果不能在后臺設置,實現301重定向步驟也很簡單:新建一個文件名為.htaccess.txt的文檔(注意前面的點號不能遺漏),在txt文檔中寫入以下301轉向代碼:
view source
print?
1
Options +FollowSymLinks
2
RewriteEngine on
3
rewritecond %{http_host} ^yanet.cn [nc]
4
rewriterule ^(.*)$ http://www.facou.cn/$1 [r=301,nc]
或者
view source
print?
1
RewriteEngine On
2
RewriteCond %{HTTP_HOST} !^
yanet.cn$ [NC]
3
RewriteRule ^(.*)$ http://www.facou.cn/$1 [L,R=301]
保存文件,將文件名稱末尾的.txt去掉,上傳到網站根目錄即可。上面的代碼表示整站所有的以帶www的域名www.facou.cn為地址的網頁都會301轉向到不帶www的域名yanet.cn(不僅是首頁,子目錄/網頁也可以)。如果是其他域名要重定向到 yanet.cn 這個新域名,則在.htaccess文件中加入如下重定向代碼:
view source
print?
1
Options +FollowSymLinks
2
RewriteEngine on
3
RewriteRule ^(.*)$ http://www.facou.cn/$1 [L,R=301]
Windows主機IIS下的301轉向設置
在IIS 管理后臺 -> 選擇你要重定向的文件或文件夾 -> 右鍵"重定向到URL" -> 輸入需要轉向的目標URL ->選擇"資源的永久重定向"。
另外,如果你的Windows虛擬主機空間支持ISAPI_Rewrite,那么在IIS下利用ISAPI_Rewrite不僅可以實現url 重寫,還可以用來設置301轉向,下面分別是三個版本的ISAPI_Rewrite對應的帶www的域名301轉向到不帶www域名的代碼:
view source
print?
01
# ISAPI_Rewrite 1.3 版本 域名的301重定向
02
RewriteCond Host: ^www\.farlee\.info$
03
RewriteRule (.*) http\://farlee\.info$1 [I,R]
04
05
# ISAPI_Rewrite 2.x 版本
06
RewriteCond Host: ^www\.farlee\.info$
07
RewriteRule (.*) http\://farlee\.info$1 [I,RP]
08
09
# ISAPI_Rewrite 3.x 版本
10
RewriteCond %{HTTP:Host} ^www\.farlee\.info$
11
RewriteRule (.*) http\://farlee\.info$1 [NC,R=301]
在其他情況下,如不同域名之間在IIS下的301重定向代碼請看詳細介紹:ISAPI Rewrite實現IIS 301轉向。
PHP 301 重定向代碼
301重定向也可以在php文件中通過加入php header來實現,代碼如下:
view source
print?
1
2
header("HTTP/1.1 301 Moved Permanently");
3
header("Location:http://www.facou.cn/");
4
exit();
5
?>
ASP 301 重定向代碼
view source
print?
1
<%@ Language=VBScript %>
2
<%
3
Response.Status="301 Moved Permanently"
4
Response.AddHeader"Location", http://yanet.cn
5
%>
ASP.NET 301 重定向代碼
view source
print?
1
CGI Perl下的301轉向代碼
view source
print?
1
$q=newCGI;
2
print$q->redirect("http://www.facou.cn/");
JSP下的301轉向代碼
view source
print?
1
<%
2
response.setStatus(301);
3
response.setHeader("Location", "http://www.facou.cn/");
4
response.setHeader("Connection","close");