開啟主選單

求真百科

''''重定向'''' 重定向(Redirect)就是通過各種方法將各種網絡請求重新定個方向轉到其它位置(如:網頁重定向、域名的重定向、路由選擇的變化也是對數據報文經由路徑的一種重定向)。

  1. 基本信息
中文名 做法  例如 其他定向 方式
重定向  將各種網絡請求轉到其它位置 網頁重定向、域名的重定向 Linux重定向 301 redirect、302 redirect
  1. 網頁定向

我們在網站建設中,時常會遇到需要網頁重定向的情況:

1.網站調整(如改變網頁目錄結構);

2.網頁被移到一個新地址;

3.網頁擴展名改變(如應用需要把.php改成.Html或.shtml)。

這種情況下,如果不做重定向,則用戶收藏夾或搜索引擎數據庫中舊地址只能讓訪問客戶得到一個404頁面錯誤信息,訪問流量白白喪失;再者某些註冊了多個域名的網站,也需要通過重定向讓訪問這些域名的用戶自動跳轉到主站點等。

摺疊

  1. 詳細介紹

常用的重定向方式有:301 redirect、302 redirect與meta fresh。

301 redirect

301代表永久性轉移(Permanently Moved),301重定向是網頁更改地址後對搜索引擎友好的最好方法,只要不是暫時搬移的情況,都建議使用301來做轉址。

302 redirect

302代表暫時性轉移(Temporarily Moved ),在前些年,不少Black Hat SEO(黑帽SEO)曾廣泛應用這項技術作弊,目前,各大主要搜索引擎均加強了打擊力度,像Google前些年對域名之王(Business)以及近來對BMW德國網站的懲罰。即使網站客觀上不是spam,也很容易被搜尋引擎容易誤判為spam而遭到懲罰。

meta fresh

這在2000年前比較流行,不過現在已很少見。其具體是通過網頁中的meta指令,在特定時間後重定向到新的網頁,如果延遲的時間太短(約5秒之內),會被判斷為spam。

摺疊

  1. 方法

301 Redirect實現網頁重定向

IIS服務器實現301重定向

  • 打開internet信息服務管理器,在欲重定向的網頁或目錄上按右鍵
  • 選擇"重定向到URL"
  • 在"重定向到"輸入框中輸入要跳轉到的目標網頁的URL地址
  • 選中"資源的永久重定向"(切記)
  • 最後點擊"應用"

Apache服務器實現301重定向

相比較來說,Apache實現起來要比IIS簡單多了。在Apache中,有個很重要的文件.htaccess,通過對它的設置,可以實現很多強大的功能,301重定向只是其中之一。

Redirect permanent / http://www.bloghuman.com/ (將目錄下內容重定向到http://www.bloghuman.com/ )

redirect permanent /index.php http://www.bloghuman.com/index.php?go=category_6(将网页index.php重定向到http://www.bloghuman.com/index.php?go=category_6)

通過合理地配置重定向參數中的正則表達式,可以實現更複雜的匹配。有興趣的朋友可參考本站Apache手冊。

PHP下的301重定向

<?php

Header( "HTTP/1.1 301 Moved Permanently" ) ;

Header( "Location: http://www.bloghuman.com" );

?>

ASP下的301重定向

<%@ Language=VBScript %>

<%

Response.Status="301 Moved Permanently"

Response.AddHeader "Location","http://www.bloghuman.com"

%>

ASP .NET下的301重定向

<script runat="server">

private void Page_Load(object sender, System.EventArgs e)

{

Response.Status = "301 Moved Permanently";

Response.AddHeader ("Location","http://www.bloghuman.com");

}

</script>

ColdFusion下的301重定向

<.cfheader statuscode="301" statustext="Moved permanently">

<.cfheader name="Location" value="http://www.new-url.com">

舊域名重定向到新域名

創建一個.htaccess文件,並將下面提供的代碼寫入文件內,它可以確保舊域名所有的目錄或者網頁正確的跳轉到新域名內。

記住.htaccess文件一定要放在舊網站的根目錄下,並且新網站要和舊網站保持相同的目錄結構及網頁文件

Options +FollowSymLinks

RewriteEngine on

RewriteRule (.*) http://www.domain.com/$1 [R=301,L]

請將上面的www.domain.com修改成你想要跳轉到的域名。

此外,這裡建議大家歸總舊網站的外部鏈接,並聯繫相應的站點修改導入鏈鏈的URL,以指向新站點。

域名301重定向到www的二級域名

在以前的文章中我反覆提及過:www.domain.com是domain.com域下的一個二級域名,並對二級域名和一級目錄之間如何選擇以及網站結構優化做了一個詳細的分析,有興趣的可以讀一下兩篇文章,網站結構優化是SEO中最重要。

OK,繼續域301跳轉到www二級域的實現方式:

創建一個.htaccess文件,並將下面提供的代碼寫入文件內,它可以確保所有來自對domain.com的請求都轉向到對www.domain.com進行請求。

Options +FollowSymlinks

RewriteEngine on

rewritecond %{http_host} ^domain.com [nc]

rewriterule ^(.*)$ http://www.domain.com/$1 [r=301,nc]

請將上面的domain.com和www.domain.com修改成你想要跳轉到的域名。

注意:.htaccess文件只有在使用安裝有Mod Rewrite模塊的Apache作為WEB服務器的Linux主機上才能起作用

  1. '檢測工具'

配置完成後,一定認真檢查一下是否正確。Internet有很多類似的Server Header檢查工具,如Check Server Headers Tool - HTTP Status Codes Checker

網站302重定向使用不當導致被GOOGLE懲罰

Business.com是網上最大的商業搜索引擎和分類目錄,以專業提供商業信息而享負盛名,包括近19萬網頁。若以"business"為關鍵詞在Google中進行搜索,該網站名列第一。不過在9月5日,Business.com遇到一件蹊蹺之事:它的首頁由PR8變成了PR0, 而且Google搜索結果中找不到首頁。好在被"蒸發"的只是首頁,不過慶幸的是第二天首頁又回到了Google的搜索結果,但PR仍舊為0。

Business.com的問題出在它的重定向命令上。該網站讓business.com跳轉到www.business.com,這種重定向本該是永久性的。我們知道,301屬於永久性重定向,而302則屬於臨時性重定向,只有當一個網站或網頁在24到48小時之內臨時移到其它位置的情況下才能使用該命令。但Business.com卻錯誤地使用了"HTTP/1.1302 Object Moved"狀態碼。

普遍現象

其實網站重定向極為普遍,譬如不滿意原來的域名而申請了一個新域名;買下容易被人錯拼的域名,防止客戶因為拼錯URL而找不到網站,等等。可是,很多人卻會由於使用了錯誤的重定向狀態碼而遭"滅站之災",就象Business.com。儘管他們的重定向理由充分合理,然而若使用不當,則可能被Google誤認為是利用多個域名指向同一網站,那麼你的網站就會被封掉,罪名是"利用重複的內容來干擾Google搜索結果的網站排名"。Business.com就是最好的前車之鑑。只不過大多數使用錯誤重定向參數的網站沒Business.com這麼幸運,一個小小的重定向就可能使網站前功盡棄,只能從頭來過:重新申請新域名,重新發布新網站,等等。記住:Google絕不會同情任何人即使無心犯下的錯誤。

摺疊編輯本段運作流程 網站服務器響應網頁瀏覽請求的運作流程

讓我們先來了解一下用戶/搜索引擎和網站一開始的交互流程。當用戶或搜索引擎向一個網站服務器發出網頁瀏覽請求時,該服務器將:

1.通過域名服務器(DNS)將域名轉換為網站的IP地址,然後返回給客戶

2.打開一個該IP套接口連接

3.記下通過該套接口的一個HTTP數據流

4.從WEB服務器接收一個響應請求的HTTP數據流。該數據流包含狀態碼,狀態碼的值由HTTP協議所決定。這裡所說的"HTTP數據流"信息也叫"頭信息(Header)"。頭信息中包括了日期,服務器類型,通常還會有一條"200 OK"信息。如果一切良好,那麼網絡服務器就會將"200 OK"信息以及請求頁面發送出去。如果網站在這時候已經建立了重定向,那麼服務器就會在頭信息中包含一個"302 Moved Temporarily"或"301 Moved Permanent"之類的響應信息。搜索引擎會根據服務器頭信息中的內容作出決定。

摺疊

  1. 指令實施

對於正確實施301重定向

1.在.htaccess文件中增加301重定向指令

2.適用於使用Unix網絡服務器的用戶。通過此指令通知搜索引擎的spider你的站點文件不在此地址下。這是較為常用的辦法。形如:Redirect 301 / http://www.yourdomain.com/

3.在服務器軟件的系統管理員配置區完成301重定向

適用於使用Window網絡服務器的用戶

4.採用"mod_rewrite"技術

通過該技術進行的改變將在.htaccess文件中體現出來,形如:

Options +FollowSymLinks

RewriteEngine on

RewriteCond %{HTTP_HOST} ^yourdomain.com

RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=permanent,L]

5.綁定/本地DNS(域名別名跳轉)

如果具有對本地DNS記錄進行編輯修改的權限,則只要添加一個記錄就可以解決此問題。

若無此權限,則可要求網站託管服務商對DNS服務器進行相應設置。

DNS服務器的設置

若要將aaa.domain.com指向www.domain.com,則只需在DNS服務中應增加一個別名記錄,可寫成:aaa IN CNAME www.domain.com。

如需配置大量的虛擬域名,則可寫成:* IN CNAME www.domain.com.

這樣就可將所有未設置的以domain.com結尾的記錄全部重定向到www.domain.com上。

6.用ASP/PHP實現301重定向:

代碼在上面已經介紹過了

  • 其他定向

Linux重定向

摺疊基本概念 a、 I/O重定向通常與 FD有關,shell的FD通常為10個,即 0~9;

b、 常用FD有3個,為0(stdin,標準輸入)、1(stdout,標準輸出)、2(stderr,標準錯誤輸出),默認與keyboard、monitor、monitor有關;

c、 用 < 來改變讀進的數據信道(stdin),使之從指定的檔案讀進;

d、 用 > 來改變送出的數據信道(stdout, stderr),使之輸出到指定的檔案;

e、 0 是 < 的默認值,因此 < 與 0<是一樣的;同理,> 與 1> 是一樣的;

f、 在IO重定向 中,stdout 與 stderr 的管道會先準備好,才會從 stdin 讀進資料;

g、 管道"|"(pipe line):上一個命令的 stdout 接到下一個命令的 stdin;

h、 tee 命令是在不影響原本 I/O 的情況下,將 stdout 複製一份到檔案去;

i、 bash(ksh)執行命令的過程:分析命令-變量求值-命令替代(``和$( ))-重定向-通配符展開-確定路徑-執行命令;

j、 ( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell,它有一點非常重要的特性是:繼承父shell的Standard input, output, and error plus any other open file descriptors。

k、 exec 命令:常用來替代當前shell 並重新啟動一個 shell,換句話說,並沒有啟動子 shell。使用這一命令時任何現有環境都將會被清除。exec 在對文件描述符進行操作的時候,也只有在這時,exec 不會覆蓋你當前的shell 環境。

摺疊基本IO cmd > file 把 stdout 重定向到 file 文件中;

cmd >> file 把 stdout 重定向到 file 文件中(追加);

cmd 1> fiel 把 stdout 重定向到 file 文件中;

cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;

cmd 2> file 把 stderr 重定向到 file 文件中;

cmd 2>> file 把 stderr 重定向到 file 文件中(追加);

cmd >> file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中(追加);

cmd < file >file2 cmd 命令以 file 文件作為 stdin,以 file2 文件作為 stdout;

cat <>file 以讀寫的方式打開 file;

cmd < file cmd 命令以 file 文件作為 stdin;

cmd << delimiter Here document,從 stdin 中讀入,直至遇到 delimiter 分界符。

摺疊進階IO >&n 使用系統調用dup (2) 複製文件描述符 n 並把結果用作標準輸出;

<&n 標準輸入複製自文件描述符 n;

<&- 關閉標準輸入(鍵盤);

>&- 關閉標準輸出;

n<&- 表示將 n 號輸入關閉;

n>&- 表示將 n 號輸出關閉;

上述所有形式都可以前導一個數字,此時建立的文件描述符由這個數字指定而不是缺省的 0 或 1。如:

... 2>file 運行一個命令並把錯誤輸出(文件描述符 2)定向到 file。

... 2>&1 運行一個命令並把它的標準輸出和輸出合併。(嚴格的說是通過複製文件描述符 1 來建立文件描述符 2 ,但效果通常是合併了兩個流。)

我 們對 2>&1詳細說明一下 :2>&1 也就是 FD2=FD1 ,這裡並不是說FD2 的值 等於FD1的值,因為 > 是改變送出的數據信道,也就是說把 FD2 的 "數據輸出通道" 改為 FD1 的 "數據輸出通道"。如果僅僅這樣,這個改變好像沒有什麼作用,因為 FD2 的默認輸出和 FD1的默認輸出本來都是 monitor,一樣的! 但是,當 FD1 是其他文件,甚至是其他 FD 時,這個就具有特殊的用途了。請大家務必理解這一點。

exec 0exec 1>outfilename # 打開文件outfilename作為stdout。

exec 2>errfilename # 打開文件 errfilename作為 stderr。

exec 0<&- # 關閉 FD0。

exec 1>&- # 關閉 FD1。

exec 5>&- # 關閉 FD5。