天天看點

HTTP狀态碼:3XX

3XX狀态碼

含義:表明浏覽器需要執行某些特殊的處理以正确的處理請求,大部分都需要進行重定向。

這類狀态碼代表需要用戶端采取進一步的操作才能完成請求。通常,這些狀态碼用來重定向,後續的請求位址(重定向目标)在本次響應的 Location 域中指明。

當且僅當後續的請求所使用的方法是 GET 或者 HEAD 時,使用者浏覽器才可以在沒有使用者介入的情況下自動送出所需要的後續請求。用戶端應當自動監測無限循環重定向(例如:A->A,或者A->B->C->A),因為這會導緻伺服器和用戶端大量不必要的資源消耗。按照 HTTP/1.0 版規範的建議,浏覽器不應自動通路超過5次的重定向。

(使用gin架構來實踐測試)

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "pong"})
	})

	r.GET("/redirect/301", redirect301)
	r.GET("/redirect/302", redirect302)
	r.Run()
}

func redirect302(c *gin.Context) {
	c.Redirect(302, "https://www.shanbay.com")
}

func redirect301(c *gin.Context) {
	c.Redirect(301, "https://www.shanbay.com")
}
      

  

301 Moved Permanently(永久重定向)

 含義:客戶請求的文檔在其他地方,新的URL在Location頭中給出,浏覽器應該自動地通路新的URL。

被請求的資源已永久移動到新位置,并且将來任何對此資源的引用都應該使用本響應傳回的若幹個 URI 之一。如果可能,擁有連結編輯功能的用戶端應當自動把請求的位址修改為從伺服器回報回來的位址。

除非額外指定,否則這個響應也是可緩存的(也就是說浏覽器會儲存urlAf傳回的301響應中Location的urlB,當下一次再去請求urlA時,會從緩存中直接得到urlB去請求,即便服務端已經把urlA的重定向改成了urlC,浏覽器也不會知道。

HTTP狀态碼:3XX

 其實我此時已經将301的重定向連結改為 https://www.shanbay.com/wordsweb/

func redirect301(c *gin.Context) {
	c.Redirect(301, "https://www.shanbay.com/wordsweb/")
}
      

302 Found (Previously "Moved temporarily") (臨時重定向)

含義:類似于301,但新的URL應該被視為臨時性的替代,而不是永久性的。

請求的資源臨時從不同的URI響應請求。由于這樣的重定向是臨時的,用戶端應當繼續向原有位址發送以後的請求。隻有在Cache-Control或Expires中進行了指定的情況下,這個響應才是可緩存的。如果這不是一個GET或者HEAD請求,那麼浏覽器禁止自動進行重定向,除非得到使用者的确認,因為請求的條件可能是以發生變化。

注意:雖然RFC 1945和RFC 2068規範不允許用戶端在重定向時改變請求的方法,但是很多現存的浏覽器将302響應視作為303響應,并且使用GET方式通路在Location中規定的URI,而無視原先請求的方法。狀态碼303和307被添加了進來,用以明确伺服器期待用戶端進行何種反應。

許多浏覽器會錯誤地響應302應答進行重定向,由于這個原因,HTTP 1.1新增了307,并期望用303和307兩個細分的狀态碼來替代含糊不清的302。

303 See Other

含義:類似于301/302,不同之處在于,如果原來的請求是POST,Location頭指定的重定向目标文檔應該通過GET提取(HTTP 1.1新)。

303與302不同之處在于,302是不會改變請求的方法,如果請求方法是POST的話,重定向的請求也應該是POST。而對于303,使用POST請求的話,重定向的請求應該是GET請求。

307 Temporary Redirect (since HTTP/1.1)

含義:和302(Found)相同(HTTP 1.1新)。

 如果這不是一個GET或者HEAD請求,那麼浏覽器禁止自動進行重定向,除非得到使用者的确認,因為請求的條件可能是以發生變化。對于307,使用POST請求的話,重定向的請求應該是POST請求。

304 Not Modified(未修改)

含義:用戶端有緩沖的文檔并發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶隻想比指定日期更新的文檔)。伺服器告訴客戶,原來緩沖的文檔還可以繼續使用。

如果用戶端發送了一個帶條件的 GET 請求且該請求已被允許,而文檔的内容(自上次通路以來或者根據請求的條件)并沒有改變,則伺服器應當傳回這個狀态碼。304響應禁止包含消息體(是以304請求可以借助浏覽器緩存來節省資源請求)。

參考文章

淺談之-http的狀态碼以及使用場景