什麼是307臨時重定向及何時需使用

錯誤型別:
HTTP錯誤
錯誤名稱:
HTTP 307临时重定向
英文名稱:
307 Temporary Redirect
錯誤描述:
这原则上并不是一个错误。307(临时重定向)状态码表示目标资源临时驻留在不同的 URI 下,如果用户代理执行自动重定向到该 URI,则用户代理不得更改请求方法。由于重定向会随着时间的推移而改变,客户端应该继续使用原始的有效请求 URI 来处理未来的请求。

什麼是307臨時重定向及何時需使用

HTTP協議定義了40多個伺服器狀態程式碼,其中9個明確用於URL重定向。每個重定向狀態程式碼都以數字 3 (HTTP 3xx) 開頭,並且有自己的處理重定向的方法。雖然它們中的一些是相似的,但它們都以不同的方式處理重定向。

作為站長,瞭解您可能遇到的各種超文字傳輸​​協議 (HTTP) 狀態程式碼非常重要。像“307重定向”這樣的其他錯誤對於確保訪問者可以成功訪問您的URL(並且您不會受到搜尋引擎的懲罰)至關重要。但是,這並不是唯一可用的重定向型別,因此您可能想知道何時適合使用它。

在這篇文章中,我們將深入介紹HTTP 307臨時重定向307內部重定向狀態程式碼,包括它們的重要性以及它們與其他 3xx 重定向狀態程式碼的區別。

  1. 什麼是HTTP 307臨時重定向?
  2. HTTP 3xx重定向的工作原理
  3. 各種HTTP 3xx重定向
  4. 使用302 vs 303 vs 307進行臨時重定向
  5. 瞭解僅HTTPS站點的HTTP 307內部重定向
  6. HTTP 307重定向和SEO

什麼是HTTP 307臨時重定向?

網際網路工程任務組 (IETF) 將307臨時重定向定義為:

307(臨時重定向)狀態碼錶示目標資源臨時駐留在不同的 URI 下,如果使用者代理執行自動重定向到該 URI,則使用者代理不得更改請求方法。由於重定向會隨著時間的推移而改變,客戶端應該繼續使用原始的有效請求 URI 來處理未來的請求。

有數十種HTTP狀態程式碼,分為五個主要類別。例如,遵循“4XX”結構的程式碼,例如404,是客戶端錯誤。

HTTP“3XX”是重定向類別。有九種不同型別的重定向。例如,301狀態程式碼用於指示網頁何時永久移動。

重定向狀態程式碼對於搜尋引擎優化 (SEO)至關重要。將使用者搜尋引擎機器人正確路由到適當的 URL 很重要,尤其是當他們移動時。

307是一種臨時重定向。此HTTP響應狀態程式碼意味著某人請求的URL已暫時移動到不同的URI(使用者資源識別符號),但最終將返回其原始位置。此外,它還告訴搜尋引擎您的伺服器與HTTP 1.1相容。

無需太技術化,307重定向是302重定向的較新版本(或後續版本)。後者可用於臨時將使用者重新路由到新URL,這在您重新設計網站時會派上用場。

另一方面,307重定向表示使用者請求的 URL 已移動到臨時位置,但會返回。302和307之間的主要區別在於請求方法不會隨著307狀態程式碼而改變:

307響應標頭

例如,請求不能從GET更改為POST。它必須是GET和GET,或者POST和POST。簡而言之,這些請求-響應方法是瀏覽器和伺服器通訊的方式。您可以在W3Schools上詳細瞭解各種HTTP請求方法之間的區別

HTTP 3xx重定向的工作原理

在我們深入研究HTTP 307臨時重定向和307內部重定向響應之前,讓我們瞭解HTTP重定向的工作原理。

HTTP狀態程式碼是從伺服器到瀏覽器的響應。每個狀態程式碼都是一個三位數字,第一個數字定義了它是什麼型別的響應。HTTP 3xx狀態程式碼意味著重定向。它們命令瀏覽器重定向到一個新的 URL,該 URL在伺服器響應的Location標頭中定義。

HTTP 3xx重定向

HTTP 3xx重定向

當您的瀏覽器遇到來自伺服器的重定向請求時,它需要了解此請求的性質。各種HTTP 3xx重定向狀態程式碼處理這些請求。瞭解所有這些將有助於我們更好地理解 307 臨時重定向和 307 內部重定向。

我們談的時候,你應該使用307重定向之前,它可能有助於瞭解如何它的工作原理。首先,您的瀏覽器向您嘗試訪問的站點的Web伺服器傳送初始請求。

使用Location標頭,伺服器然後以HTTP 3XX狀態程式碼(在本例中為307)進行響應。然後瀏覽器將請求傳送到新的URL位置,伺服器再次響應(這次通過傳送顯示網頁所需的資料)。

請注意,有兩種型別的307重定向:臨時和內部。307內部重定向是307臨時的變體,發生在瀏覽器級別。因此,它不會影響您網站的SEO。

各種HTTP 3xx重定向

有幾種型別的HTTP 3xx重定向狀態程式碼。最初的HTTP規範不包括307臨時重定向和308永久重定向,因為這些角色是由301永久遷移和302發現來填補的。

然而,大多數客戶端將HTTP請求方法從POST更改為GET以獲取301和302重定向響應,儘管HTTP規範不允許客戶端這樣做。這種行為需要在HTTP/1.1更新中引入更嚴格的307 臨時重定向308 永久重定向狀態程式碼。

HTTP 307 內部重定向響應是307 臨時重定向狀態程式碼的變體。它不是由HTTP標準定義的,只是一個本地瀏覽器實現。我們稍後會更詳細地討論它。

雖然預設情況下會快取諸如301和308之類的重定向狀態程式碼,但其他諸如302和307之類的則不會。但是,您可以通過新增Cache-ControlExpires響應頭欄位使所有重定向響應可快取(或不可快取)。

HTTP重定向並不複雜

HTTP重定向並不複雜

使用302 vs 303 vs 307進行臨時重定向

如上圖所示,對於臨時重定向,您有三個選項:302、303或307。但是,大多數客戶端將302狀態程式碼視為303響應並將HTTP請求方法更改為GET。從安全的角度來看,這並不理想。

“ RFC 1945 和 RFC 2068 指定不允許客戶端更改重定向請求的方法。然而,大多數現有的使用者代理實現將 302 視為 303 響應,無論原始請求方法如何,對 Location 欄位值執行 GET。狀態程式碼 303 和 307 已新增用於希望明確明確客戶端期望哪種反應的伺服器。”–  HTTP/1.1。狀態程式碼定義,W3.org

因此,對於需要維護HTTP請求方法的臨時重定向,請使用更嚴格的HTTP 307臨時重定向響應。

例如將/register-form.html重定向到signup-form.html,或從/login.php重定向到/signin.php。

對於需要將重定向請求方法更改為GET的情況,請改用303 See Other響應。

例如,從 /register.php頁面重定向POST請求以通過GET請求載入/success.html頁面。

除非您的目標受眾使用舊客戶端,否則請避免使用302 Found重定向響應。

瞭解僅HTTPS站點的HTTP 307內部重定向

如果您有一個僅支援HTTPS的站點,當您嘗試通過常規http://不安全地訪問它時,您的瀏覽器將自動重定向到其安全的https://版本。通常,這發生在來自伺服器的301永久遷移重定向響應中。

例如,如果您訪問http://citibank.com並在Chrome中載入DevTools並選擇網路選項卡,您可以看到瀏覽器和伺服器之間發出的所有請求。

第一個響應是301 Moved Permanently,它將瀏覽器重定向到站點的HTTPS版本。

301響應重定向到HTTPS版本

301響應重定向到HTTPS版本

如果我們深入研究第一個請求的Headers欄位,我們可以看到Location響應標頭定義了重定向的安全URL是什麼。

位置響應頭定義了重定向URL

位置響應頭定義了重定向URL

這種方法的問題在於惡意行為者可以劫持網路連線以將瀏覽器重定向到自定義URL。像這樣的中間人 (MITM) 攻擊非常普遍。一部受歡迎的電視劇甚至在其中一集中對其進行了惡搞。

此外,惡意方可以在不更改瀏覽器位址列中顯示的URL的情況下發起MITM攻擊。例如,可以為使用者提供看起來與原始站點完全相同的網路釣魚頁面。

由於一切看起來都一樣,包括位址列中的URL,大多數使用者會很樂意輸入他們的憑據。你可以想象為什麼這會很糟糕。

301重定向到HTTPS不安全

301重定向到HTTPS不安全

使用HTTP 307內部重定向安全重定向

現在,讓我們用閃電博嘗試相同的示例。訪問http://www.wbolt.com會導致網路請求,如下面的螢幕截圖所示。

307內部重定向示例

307內部重定向示例

站點的第一個請求與前面的示例類似,但這次會導致307 內部重定向響應。單擊它會向我們顯示有關此響應的更多詳細資訊。

注意:如果您嘗試直接使用https://訪問該站點,您將不會看到此標頭,因為瀏覽器不需要執行任何重定向。

307內部重定向響應的響應頭

307內部重定向響應的響應頭

注意 Non-Authoritative-Reason: HSTS響應頭。這是HTTP 的嚴格傳輸安全 (HSTS),也稱為Strict-Transport-Security響應標頭。

什麼是 HSTS(嚴格傳輸安全)?

IETF於2012年批准了HTTP嚴格傳輸安全(HSTS),以強制瀏覽器在站點嚴格執行HTTPS時使用安全連線。

這類似於Chrome或Firefox說:“我甚至不會嘗試通過不安全的HTTP協議請求此站點或其任何資源。相反,我會將其更改為HTTPS,然後再試一次。”

通過307內部重定向響應提高安全性

通過307內部重定向響應提高安全性

深入研究第二個請求的響應頭會讓我們更好地理解。

驗證HSTS響應頭

驗證HSTS響應頭

在這裡,您可以看到 strict-transport-security: max age=31536000響應頭。

strict-transport-security響應頭的max-age屬性定義了瀏覽器應該遵循這種模式的時長。在上面的示例中,此值設定為3153600秒(或 1 年)。

一旦站點返回此響應標頭,瀏覽器甚至不會嘗試發出普通的HTTP請求。相反,它將執行307 內部重定向到HTTPS並重試。

每次重複此過程時,都會重置響應標頭。因此,瀏覽器將無法無限期地發出不安全的請求。

什麼是HSTS預載入列表?

即使使用HSTS,也存在明顯的安全問題。您使用瀏覽器傳送的第一個HTTP請求是不安全的,因此重複了我們之前在花旗銀行中觀察到的問題。

此外,HSTS響應頭只能通過HTTPS傳送,因此初始的不安全請求甚至無法返回。

為了解決這個問題,HSTS在其響應頭中支援預載入屬性。這個想法是有一個網站列表,強制在瀏覽器中預載入HSTS,完全繞過這個安全問題。

將您的站點新增到瀏覽器的HSTS預載入列表中,它會知道您的站點執行嚴格的HSTS策略,即使它是第一次訪問您的站點。然後,瀏覽器將使用307 內部重定向響應將您的站點重定向到其安全的https://方案,然後再請求其他任何內容。

您應該注意,與307 Temporary Redirect不同,307 Internal Redirect響應是瀏覽器本身設定的“假標頭”。它不是來自伺服器、網路主機或 CMS(例如 WordPress)。

將站點新增到HSTS預載入列表有許多優點:

  1. Web伺服器永遠不會看到不安全的HTTP請求。這減少了伺服器負載並使站點更加安全。
  2. 瀏覽器負責從HTTP到HTTPS的重定向,使網站更快、更安全。

HSTS預載入列表要求

如果要將站點新增到瀏覽器的HSTS預載入列表中,則需要勾選以下條件:

  • 為您的域安裝了有效的SSL/TLS證書。
  • 通過將所有HTTP流量重定向到HTTPS來強制執行嚴格的HTTPS。
  • 所有子域都應通過HTTPS提供服務,特別是www子域(如果該子域的DNS記錄存在)。
  • 您的基本域應包含具有以下屬性的 HSTS 標頭:
    • 最大週期屬性必須至少31536000秒(1年)來設定。
    • includeSubdomains預載指令必須指定。
    • 如果您提供額外的重定向服務,它必須包含HSTS標頭,而不是它重定向到的頁面。

從HSTS預載入列表中刪除您的域可能既困難又耗時(最多 12 周或更長時間)。當且僅當您完全致力於在您的站點上使用HTTPS時啟用 HSTS。您可以通過在hstspreload.org上提交表單將您的站點從HSTS預載入列表中刪除。

將您的站點新增到HSTS預載入列表

HSTS預載入列表提交

HSTS預載入列表提交

有兩種方法可以將您的站點新增到HSTS預載入列表中。

  1. 通過將您的站點提交到HSTS預載入列表目錄。例如,hstspreload.org主列表由Chromium開源專案維護,並被大多數主要瀏覽器(Firefox、Chrome、Safari、IE 11 和 Edge)使用。
  2. 通過將以下標題欄位新增到您的站點:

嚴格傳輸安全:max-age=63072000;包括子域;預載

使用第二種方法,瀏覽器第一次訪問您的網站將不會完全安全。但是,後續訪問將是完全安全的。

Mozilla的HSTS預載入列表示例

Mozilla的HSTS預載入列表示例

您可以使用安全標頭等免費線上工具來驗證您的站點是否正在執行HSTS。如果您擔心瀏覽器對HSTS的支援,您可以放心,因為當今使用的幾乎所有瀏覽器都支援 HSTS

HSTS得到所有主流瀏覽器的廣泛支援

HSTS得到所有主流瀏覽器的廣泛支援

HTTP 307 重定向和SEO

由於307 Temporary Redirect響應顯示資源已臨時移至新 URL,因此搜尋引擎不會更新其索引以包含此新 URL。來自原始 URL 的“link-juice”不會傳遞到新 URL。

這與 301 Moved Permanently 重定向形成對比,其中搜尋引擎更新其索引以包含新 URL,並將“link-juice”從原始 URL 傳遞到新 URL。

使用307 內部重定向響應,一切都發生在瀏覽器級別。因此,它應該不會對您網站的 SEO 產生直接影響。但是,將您的站點新增到 HSTS 預載入列表可以使其載入更快且更安全,這兩者都可以幫助它在搜尋結果中排名更高

注意不要無意中將使用者和機器人重定向到無限重定向迴圈中,從而導致“重定向過多”錯誤。

何時使用307重定向

重定向可能是您網站維護的一個有用部分。但是,重要的是要小心使用它們的時間和方式,以及使用哪些。過多的URL重定向會減慢您的載入時間,並損害您的使用者體驗 (UX) 和SEO。

因此,最佳做法是謹慎使用它們。話雖如此,使用307重定向時有一些場景是合適的。這包括當您:

  • 更新頁面上的內容
  • 遷移到不同的內容管理系統 (CMS)
  • 切換域名
  • 由於維護而暫時關閉您的網站

關鍵是僅在您知道移動是暫時的才使用307重定向。否則,您最好使用301或308重定向,這樣您的SEO中的連結權重就會從舊URL傳遞到新URL。

當您打算永久刪除或移動頁面,或者您正在更改頁面的永久連結結構時,通常最好使用301重定向。同樣,當您仍然希望它們指向的頁面出現在搜尋引擎結果中時,最好使用 301 重定向。如果您想在您建立的新頁面上從訪問者那裡獲得反饋,同時又不妨礙您的SEO,這也會很有幫助。

如何在網站上實施307臨時重定向

除了瞭解各種型別的重定向之外,瞭解如何正確實現和使用它們也很重要。以下是在您的網站上使用 307 重定向的一些關鍵提示。

通過.htaccess檔案實現臨時重定向

有幾種不同的方法來實現重定向。在WordPress網站上,最好的方法通常是在您的.htaccess檔案中指定307重定向,該檔案是您的主要伺服器配置檔案。

請注意,由於這是一個如此重要的檔案,因此謹慎對待對其所做的任何更改至關重要。我們還建議在修改此檔案之前建立站點的備份,尤其是在您沒有太多開發經驗的情況下。

然後您可以通過檔案傳輸協議 (FTP) 客戶端或您的主機帳戶的檔案管理器應用程式訪問它。通常,您可以在站點根目錄的public_html資料夾中找到它:

file-manager-htaccess

.htaccess檔案中,您可以使用mod_rewrite模組實現重定向。這看起來像這樣:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 使用臨時重定向將服務頁面重定向到新頁面
RewriteRule “^/service$” “/about/service” [R]
# 使用臨時重定向將服務頁面重定向到新頁面 RewriteRule “^/service$” “/about/service” [R]
# 使用臨時重定向將服務頁面重定向到新頁面 
RewriteRule “^/service$” “/about/service” [R]

如需更多資訊和指導,您可能需要參考Google的搜尋中心關於建立重定向的指南

使用外掛實現連結重定向

除了自己手動配置重定向,另一種選擇是使用WordPress重定向解決方案,例如Quick Page/Post Redirect Plugin

quick-pagepost-redirect

這個免費工具可讓您將301、302和307重定向新增到您的WordPress 網站。但是,重要的是要注意它使用所謂的“元重新整理”重定向。

元重新整理重定向發生在瀏覽器中,而不是您的Web伺服器中。這意味著重定向會告訴瀏覽器在特定時間跨度內導航到指定的URL。當您看到一個網頁內容如下:“如果您沒有在5秒內重定向,請單擊此處”時,就會發生這種情況。

這些型別的重定向不僅會使您的訪問者感到困惑,而且如果使用頻率過高,它們還會使搜尋引擎抓取工具認為您的網站包含垃圾郵件內容。因此,我們只建議在您無法通過.htaccess檔案設定重定向時使用此方法(例如,如果您的 Web 主機不提供對它的訪問)。

小結

深入瞭解HTTP響應狀態程式碼是成為成功網站所有者的重要組成部分。設定重定向可以幫助您正確執行站點維護。如果您只想臨時移動URL,我們建議您使用307重定向。

正如我們在這篇文章中所討論的,307重定向是一種狀態程式碼,您可以使用它來將訪問者指向一個新的 URL,但最終在您完成更改或更新後將他們帶回原始 URL。當您不希望連結權重從舊URL傳遞到新URL時,最好使用此選項。

此外,或者你應該閱讀更多關於連結重定向的相關文章,以加深這一塊的瞭解:

評論留言