在優化網站的時候,301 重定向是站長們必不可缺的一項優化,而 301 重定向主要用於將內容從一個位置移動到另外一個位置。其實,在理解上也是非常簡單的,比如我在 http://www.abc.com/a.html 上有一些內容,接着我想重構網站,於是我想把此頁面上的內容移動到 http://www.abc.com/b.html 上。所以,我可以實施 301 重定向將這個頁面的所有指標全部轉移到另一個頁面上。
可能有人會問,為什麼非要給重構的網站做 301 重定向? 首先做 301 重定向之前要明白一點,重定向不僅對用户很重要,而且對於搜索引擎也是很重要的,當網站改版後並通過實施 301 重定向, 可以讓用户或搜索引擎訪問舊版頁面不是 404 錯誤頁面,而是成功訪問新版本的頁面,還可以讓搜索引擎知道你是何時移動內容的,所以才會給需要重構的網站做 301 重定向。

為什麼今天談 301 重定向的問題呢? 之所以談這個問題也是因為之前在分析診斷企業網站時,發現了各種各樣的 301 重定向問題:比如企業網站重構後沒用對舊版本的頁面重定向到新版本,導致重構後的網站出現大量的 404 錯誤頁面,而且網站也因為這些 404 頁面導致權重流失、降權。
另外,在設置 301 重定向的時出現設置錯誤或不知道該怎麼去設置等情況。筆者發現很多企業的站長對 301 重定向認識不夠、操作錯誤等。下面針對這個問題做一些整理,希望可以幫助到中小型企業站長正確、有效的設置 301 重定向。
一、 301 重定向的作用
301 重定向的作用有很多,平時站長在做 301 重定向的時候,一是為了 URL 規範化並集中權重不讓權重分散、二是為了網站改版,將舊版本的頁面的所有指標全部轉移到新版本的頁面上。而實施 301 重定向可以做到這些,在作用上也是非常的強大,也建議中小企業的站長有效的利用 301 重定向給網站帶來的作用。
二、在什麼情況下必須做 301 重定向
以下五種情況是必須要做 301 重定向的,當然如果這五種情況都沒有發生的話可以選擇不做,下面詳細的介紹一下。
①:網站的舊內容過期並被刪除掉
網站的一些內容過期了,所以要被刪掉了,如果還想留着可以通過 301 重定向實現。
②:網站有一些具有鏈接和流量的無效 URL
如果你發現這些無效的 URL 還有流量權重,可以通過 301 重定向重新生成頁面。
③:網站更換了主機託管公司
如果網站更換了主機託管公司,不影響用户查找網站內容的任何 URL 的情況下,可以不需要做 301 重定向。
④:網站更換程序
網站進行較大的改版,網站程序需要更換,此時會影響很多 URL,可以通過 301 重定向來解決。
⑤:網站實施 URL 規範化
網站默認的 URL 分:
1 、 abc.com
2 、 www.abc.com
3 、 abc.com/index.html
4 、 www.abc.com/index.html
為了進行網址規範化和不分散權重,通常只出現一個標準的 URL,我們可以通過 301 重定向來實現。例如:我的網站網址只出現 http://www.abc.com/的 URL,我可以將其他三個 URL 通過 301 重定向到這個 URL 上,這樣以來就不會分散權重了,可能帶 index.html 後綴的 URL 做 301 重定向容易出現死循環,為了避免這樣的情況也是有解決辦法的,下面會詳細講解的。
⑥:網站因為各種原因而改變現有內容的 URL
可能企業網站因為各種各樣的原因而改變了現有內容的 URL,這種情況的發生是站長沒法預測到的,如果這種情況發生了而改變了 URL,建議通過 301 重定向來解決,盡力避免死鏈接的出現。
總結上述需要注意:並不是所有的情況都是需要做 301 重定向的; 但是,任何 URL 的更改都是需要做 301 重定向的。原因很簡單,為了避免出現 404 錯誤頁面而導致不該發生的情況發生。
三、做 301 重定向的注意事項
當 301 重定向實施完之後,舊版本頁面跳轉到了新版本頁面,或網址規範化了再或者其他的,大部分的站長都不會注意到 301 的 HTTP 狀態是否返回成功。就在此時,可能有些網站的 301 重定向不傳遞狀態或者出現 404 錯誤的狀態碼,這樣容易造成任何情況下做的 301 重定向無法達到效果。筆者認為,想要正確的、有效果的做 301 重定向,一些細節還是需要注意的。
例如:404 錯誤 (頁面未找到) 或者 200 OK(頁面成功加載);301(返回 301 狀態碼成功)
正確的 HTTP 狀態碼:

錯誤的 HTTP 狀態碼:

總結上述需要注意:如果遇到這種情況也是一個被重視的問題,所以要避免這樣的問題發生,如果站長在做 301 永久重定向後,一定要確保 HTTP 狀態是返回 301,如果 HTTP 狀態碼不是返回的 301 狀態碼而是 200 或 404 再或者是其他的狀態碼,那麼 301 重定向應該未操作成功,建議站長檢查是哪點出的問題然後解決。
四、 301 永久重定向後權重會不會疊加
301 永久重定向後權重會不會疊加呢? 很多站長都在考慮這個問題,部分站長想通過這種途徑來投機取巧。 301 永久重定向後權重是可以疊加的,但權重不會相加。那麼,什麼樣的網站做 301 重定向權重是可以疊加的,什麼樣的網站做 301 重定向權重是不能疊加的? 下面詳細的説明一下。
①:兩個相同的網站做 301 重定向是可以疊加權重的,但權重不是全部轉移過來,而且要看站點符不符規則,一般來説權重再轉移的時候會損失一部分。
②:兩個不相同的網站做 301 重定向是不可以疊加權重的,為什麼呢? 如果兩個網站一點也不相同,權重不僅不會轉移過來,而且百度也不願意這麼做,所以兩個不相同的網站沒法傳遞權重和疊加權重。
五、 301 重定向和 302 重定向的區別
重定向的方法其實是有很多的,但不同的方法會出現不同的結果,而且區別也是非常大的。目前,根據 WEB 服務器返回給瀏覽器的 HTTP 狀態碼,重定向主要分為 301 永久重定向、 302 臨時重定向,兩種重定向是根據不同情況來做的,下面就詳細的對兩種重定向詳細的説明一下。
①:301 永久重定向
首先,301 永久重定向。這個狀態碼告訴用户、搜索引擎、瀏覽器,該資源已經永久性的移動到另一個位置 (舊版本頁面永久重定向到新版本頁面),而且沒有恢復原位的打算。 301 永久重定向最適合目錄轉移,推薦使用 301 重定向!
②:302 臨時重定向
然後,302 臨時重定向。這個狀態碼告訴用户、搜索引擎、瀏覽器,該資源已經暫時性的移動到另外一個位置 (舊版本頁面臨時重定向到新版本頁面),這種移動不會當作永久性,而且會恢復原來的位置,但一些情況下適合使用 302 重定向。
302 重定向對手機站優化是有一定的好處,百度官方給的建議:比如減少內容死鏈,如果沒有內容,最好通過 HTTP 狀態碼指定,如 404 、 403 等; 如果內容死鏈希望重定向到首頁,最好通過 302 跳轉,不要使用 javascript 跳轉。此時可以發現 302 重定向對手機站優化是有好處的。
注意:兩種形式的重定向都會將用户、搜索引擎發送到新的位置 (頁面),但搜索引擎對待這兩個 HTTP 狀態碼卻不同。當搜索引擎看到 301 狀態碼的時候,會判斷舊版本頁面將權重或任何其他的指標永久轉移到新頁面。當搜索引擎看到 302HTTP 狀態碼的時候,會假設它不應該將舊頁面的歷史鏈接跟權重轉移到新的頁面,意思是轉移後還是會轉移回來的。另外,如果做 301 永久重定向,會導致搜索引擎從索引上 (百度、谷歌) 刪除舊頁面並用新頁面代替。
六、 301 永久重定向首頁索引文件,如何避免出現循環
做優化的站長都應該知道,絕大部分網站的首頁 URL 都是以 http://www.abc.com/index.html 的形式表現,但一般都是輸入 http://www.admin5.cn/訪問首頁。而此時首頁出現了兩個的版本的 URL,給網站帶來的影響則是分散鏈接權重。可能有站長會想到網址規範化。是的,沒錯,通過網址規範化即可實現一個標準的 URL 表現形式。
大部分的站長看到這種情況都會通過 301 永久重定向將 http://www.abc.com/index.html 重定向到 http://www.admin5.cn/上,然後通過 301 永久重定向修復 URL 。但是,如果站長沒有正確的實施 301 重定向,通常 301 重定向的問題會擴大,比如出現死循環現象。
默認文檔重定向解決方案:
①:將 index.php 的內容複製到另外一個文件,比如 a.php 文件。
②:為文檔目錄創建一個 Apache DirectoryIndex 指令,將該質量的目標設置為 a.php,不要在全服務器級別上設置該指令; 否則,它可能造成其他仍然需要使用 index.php 作為目錄索引的文件夾的問題。
③:在文檔根目錄下的.htdaccess 文件中放入:DirectoryIndex a.php 或者,如果不使用各個目錄中單獨的上下文文件,可以在.htdaccess 中放入以下內容:DirectoryIndex a.php
④:清除原始 index.php 文件內的內容,插入如下代碼:

總結上述需要注意:這樣的設置讓 index.php 不再是目錄索引文件,也就是默認文件名。它在用户輸入規範 URLhttp://www.abc.com/時會強制讀取 a.php,那麼任何從舊鏈接到 index.php 的請求現在都進行了 301 重定向然後避免無限循環。
七、如何實施 301 重定向
①:虛擬主機
Linux 虛擬主機設置 301 跳轉方法:
在本地新建一個文本文件,最好用的專業的編輯器軟件如 EditPlus 將代碼粘入
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.abc.com$ [NC]
RewriteRule ^(.*)$ http://www.abc.com/$1 [R=301,L]
説明:上述規則是將站點所以訪問域名都重定向到 www.abc.com(規則中的域名請修改為自己的域名),如果僅想將綁定在站點上某個域名 (如:www.123.com) 重定向到 www.abc.com,規則如下:
RewriteCond %{HTTP_HOST} ^www.123.com$ [NC]
RewriteRule ^(.*)$ http://www.abc.com/$1 [R=301,L]
如果有多種需求,如 abc.com 跳轉到 www.abc.com qwe.com 跳轉到 www.qwe.com,規則如下:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^abc.com$ [NC]
RewriteRule ^(.*)$ http://www.abc.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^qwe.com$ [NC]
RewriteRule ^(.*)$ http://www.qwe.com/$1 [R=301,L]
根據自己的需要進行添加修改,然後上傳到服務器 wwwroot 目錄,改名為.htaccess 即可
win 虛擬主機設置 301 跳轉方法:
手動設置的 (沒有自動生成)
1 、進入主機控制面板,進入 ISAPI 篩選器設置,點擊"開啓自定義 URL 靜態化支持"按鈕。
2 、待開啓偽靜態功能後,進入 FTP 文件管理,找到 othersdiscuzhttpd.conf 修改這裏面的規則。
3 、示例代碼:
RewriteCond %{HTTP:Host} ^abc.com$
RewriteRule (.*) http://www.abc.com$1 [NC,R=301]
#第一條表示要做跳轉的域名,第二條表示要跳轉到的域名
#如果有很多域名要做跳轉,那麼可以將第一條規則改為
RewriteCond %{HTTP:Host} !^www.abc.com$
這樣,就表示非 www.abc.com 的域名訪問都會跳轉到 www.abc.com #多個域名做跳轉的第二種方法是,首先複製多個 RewriteCond 項,將域名改好 除了最後一項,其餘的 RewriteCond 項最後都要加個參數 [OR] 即可。
注意:現在很多虛擬主機都自帶 301 的配置,可以在主機控制面板上生成代碼信息,然後按照上面的提示進行 301 重定向。
②:window 獨立服務
Win 獨立服務 301 設置 (win2003 、 win2008):
1 、 IIS 服務器實現 301 重定向
打開 IIS,右鍵-屬性-網站-IP 地址那裏點編輯增加一個站點,然後綁定一下主機頭,也可以綁定更多的閒置域名。如圖所示:

打開 IIS,首先新建立一個站點,隨便對應一個目錄 E:wwwroot301web 。該目錄下只需要 2 個文件,一個 default.html,一個 404.htm 。在欲重定向的網頁或目錄上按右鍵; 選中“ 重定向到 URL”; 在對話框中輸入目標頁面的地址; 切記,記得選 中“ 資源的永久重定向”; 當然,最後要點擊“ 應用”,完成。如下圖所示:

注意:win2003 跟 win2008 都是使用 IIS 服務器,所以 301 重定向的步驟方法是一樣的。
③:Linux 獨立服務器
Linux 獨立服務器 301 設置 (紅帽企業版、 centos):
我用的是紅帽企業版,用的是源碼包裝的 Web 環境。然後我進入 Linux 服務器,找到 apache 的主配置文件 httpd.conf , 我的 apache 服務器下有多個虛擬主機,我找到我要做 301 重定向的虛擬主機,然後添加如何的代碼 (代碼是完整的):
1 、進入 Linux 服務器,然後找到 httpd.conf 的 Apache 主配置文件,下圖紅色框是我所在的完整位置,藍色框是內容,也就是命令 pwd 現實所在位置,ls 查詢當前位置的內容。

既然找到主配置文件了,我們通過命令 vi httpd.conf 編輯一下,在最後添加如下完整的代碼。要找到配置的那個虛擬主機然後添加代碼, 不要亂添加。
ServerName www.abc.com
ServerAdmin webmaster@dummy-host.example.com
LogLevel warn
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
ServerName abc.com
ServerAdmin webmaster@dummy-host.example.com
RewriteEngine on
RewriteRule ^(.*)$ http://www.abc.com$1 [R=301,L]
LogLevel warn
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
注意:不同形式安裝的 apache 其路徑是不同的,有源碼包、有 YUM 等安裝方式,兩種馬路是不一樣的,建議新手聯繫空間商並實施 301 重定向。
④:綁定/本地 DNS
如果具有對本地 DNS 記錄進行編輯修改的權限,則只要添加一個記錄就可以解決此問題。若無此權限,則可要求網站託管服務商對 DNS 服務器進行相應設置。
⑤:DNS 服務器的設置
若要將 blog.abc.com 指向 www.abc.com,則只需在 DNS 服務中應增加一個別名記錄,可寫成:blog IN CNAME www.abc.com 。
如需配置大量的虛擬域名,則可寫成:* IN CNAME www.abc.com.
這樣就可將所有未設置的以 abc.com 結尾的記錄全部重定向到 www.abc.com 上。
寫在最後:
上述則是筆者整理的 301 重定向。總的來説,網站改版可以通過 301 重定向將舊版本頁面的所有全部傳遞到新版本頁面上,另外則是對 URL 做規範化。實施的過程中要注意為什麼要做 301 重定向、方法的操作、操作的正確度等,為了更好的設置 301 重定向,建議參考以上整理的內容。