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,瀏覽器也不會知道。
其實我此時已經將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請求可以借助瀏覽器緩存來節省資源請求)。