在最佳化網站的時候,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 重定向,建議參考以上整理的內容。