HTTP 中的重定向
URL 重定向,也稱為URL 轉發,是一種為頁面、表單、整個網站或 Web 應用程式提供多個 URL 地址的技術。HTTP 針對此操作提供了一種特殊的響應,稱為HTTP 重定向。
重定向可以實現多種目標
- 站點維護或停機期間的臨時重定向
- 更改站點 URL 後保留現有連結/書籤的永久重定向,上傳檔案時的進度頁面等。
原理
永久重定向
臨時重定向
有時無法從其規範位置訪問請求的資源,但可以從其他位置訪問它。在這種情況下,可以使用臨時重定向。
搜尋引擎機器人和其他爬蟲不會記住新的臨時 URL。在建立、更新或刪除資源時,臨時重定向也用於顯示臨時進度頁面。
| 程式碼 | 文字 | 方法處理 | 典型用例 |
|---|---|---|---|
302 |
找到 |
GET方法不變。其他方法可能會或可能不會更改為GET。[2] |
網頁由於不可預見的原因暫時不可用。 |
303 |
檢視其他 |
GET方法不變。其他方法更改為GET(主體丟失)。 |
用於在PUT或POST之後重定向,以便重新整理結果頁面不會重新觸發操作。 |
307 |
臨時重定向 |
方法和主體不變 | 網頁由於不可預見的原因暫時不可用。當站點上提供非GET操作時,它比302更好。 |
[2] 規範不打算允許方法更改,但有些現有使用者代理確實會更改其方法。307是為了消除使用非GET方法時的行為歧義而建立的。
特殊重定向
指定重定向的替代方法
HTML 重定向
HTTP 重定向是建立重定向的最佳方法,但有時您無法控制伺服器。在這種情況下,請嘗試在頁面的<head>中使用<meta>元素,並將它的http-equiv屬性設定為Refresh。顯示頁面時,瀏覽器將轉到指定的 URL。
<head>
<meta http-equiv="Refresh" content="0; URL=https://example.com/" />
</head>
該content屬性應以一個數字開頭,該數字指示瀏覽器在重定向到給定 URL 之前應等待多少秒。始終將其設定為0以符合可訪問性標準。
顯然,此方法僅適用於 HTML,不能用於影像或其他型別的內容。
JavaScript 重定向
JavaScript 中的重定向是透過將 URL 字串設定為window.location屬性來執行的,載入新頁面
window.location = "https://example.com/";
與 HTML 重定向一樣,這並非適用於所有資源,並且顯然,這僅適用於執行 JavaScript 的客戶端。另一方面,可能性更多:例如,只有在滿足某些條件時才能觸發重定向。
優先順序順序
有三種方法可以觸發重定向,可以同時使用幾種方法。但是哪個首先應用?
- HTTP 重定向始終首先執行——它們存在於甚至沒有傳輸頁面時。
- 有點令人驚訝的是,JavaScript 重定向在 HTML 重定向之前執行。這是因為
<meta>重定向發生在頁面完全載入之後,也就是所有指令碼執行之後。 - 如果之前沒有執行任何 HTTP 重定向或 JavaScript 重定向,則 HTML 重定向(
<meta>)將在頁面載入後執行。 - 如果在頁面載入後發生任何 JavaScript 重定向(例如,單擊按鈕),如果頁面尚未透過先前的方法重定向,則它將最後執行。
如果可能,請使用 HTTP 重定向,不要新增<meta>元素重定向。如果有人更改了 HTTP 重定向但忘記更改 HTML 重定向,則重定向將不再相同,這可能會導致無限迴圈或其他問題。
用例
重定向有許多用例,但由於每次重定向都會影響效能,因此應將其使用量降至最低。
域名別名
保持連結有效
當您重組網站時,URL 會發生更改。即使您更新網站的連結以匹配新的 URL,您也無法控制外部資源使用的 URL。
您不希望破壞這些連結,因為它們會帶來有價值的使用者並幫助您的搜尋引擎最佳化,因此您會設定從舊 URL 到新 URL 的重定向。
注意:此技術確實適用於內部連結,但請儘量避免使用內部重定向。重定向會產生明顯的效能成本(因為會發生額外的 HTTP 請求)。如果可以透過更正內部連結來避免這種情況,則應更正這些連結。
對不安全請求的臨時響應
對長時間請求的臨時響應
在常見伺服器中配置重定向
Apache
重定向可以在伺服器配置檔案或每個目錄的.htaccess中設定。
mod_alias 模組具有 Redirect 和 RedirectMatch 指令,預設情況下會設定 302 重定向
<VirtualHost *:443>
ServerName example.com
Redirect / https://www.example.com
</VirtualHost>
URL https://example.com/ 將重定向到 https://www.example.com/,其下的任何檔案或目錄也將重定向(例如 https://example.com/some-page 將重定向到 https://www.example.com/some-page)
RedirectMatch 的功能相同,但它使用 正則表示式 來定義受影響的 URL 集合。
RedirectMatch ^/images/(.*)$ https://images.example.com/$1
images/ 目錄中的所有文件將重定向到不同的域名。
如果您不希望進行臨時重定向,可以使用額外的引數(HTTP 狀態碼或 permanent 關鍵字)來設定不同的重定向。
Redirect permanent / https://www.example.com
# …acts the same as:
Redirect 301 / https://www.example.com
mod_rewrite 模組也可以建立重定向。它更加靈活,但也稍微複雜一些。
Nginx
在 Nginx 中,您可以為要重定向的內容建立特定的伺服器塊。
server {
listen 80;
server_name example.com;
return 301 $scheme://www.example.com$request_uri;
}
要將重定向應用於目錄或僅某些頁面,請使用 rewrite 指令。
rewrite ^/images/(.*)$ https://images.example.com/$1 redirect;
rewrite ^/images/(.*)$ https://images.example.com/$1 permanent;
IIS
在 IIS 中,您可以使用 <httpRedirect> 元素配置重定向。
重定向迴圈
重定向迴圈發生在後續的重定向遵循已經執行的重定向時。換句話說,存在一個永遠無法結束的迴圈,並且永遠找不到任何頁面。
大多數情況下,這是伺服器問題,如果伺服器能夠檢測到它,它將傳送 500 內部伺服器錯誤。如果您在修改伺服器配置後不久遇到此錯誤,則很可能是重定向迴圈。
有時,伺服器無法檢測到它:重定向迴圈可能跨越多個伺服器,每個伺服器都沒有完整的畫面。在這種情況下,瀏覽器將檢測到它並顯示錯誤訊息。Firefox 顯示
Firefox 檢測到伺服器正在以永不終止的方式重定向此地址的請求。
…而 Chrome 顯示
此網頁存在重定向迴圈。
在這兩種情況下,使用者都無能為力(除非他們的客戶端出現問題,例如快取或 Cookie 不匹配)。
避免重定向迴圈非常重要,因為它們會完全破壞使用者體驗。