- 論壇徽章:
- 0
|
重定向是一個(gè)看似簡(jiǎn)單,實(shí)際很復(fù)雜的問(wèn)題。HTTP狀態(tài)碼一共才五個(gè)系列(1XX,2XX,3XX,4XX,5XX),而重定向狀態(tài)碼被單獨(dú)作為一個(gè)系列
(3XX)存在,足以說(shuō)明它的重要性,但是很多人認(rèn)為知道301/302的區(qū)別就算熟悉重定向了,這實(shí)在是一大謬誤。本文主要介紹一下303/307。
為了方便測(cè)試,首先熟悉一下如何使用curl命令得到響應(yīng)頭:
-I/--head
(HTTP/FTP/FILE) Fetch the HTTP-header only! HTTP-servers feature
the command HEAD which this uses to get nothing but the header of a
document. When used on a FTP or FILE file, curl displays the file size
and last modification time only.
例子命令:curl -I http://www.google.com/
通常PHP里的重定向是這樣的:
header('Location: http://localhost/');
exit();
通過(guò)curl命令訪問(wèn)如上的代碼,我們將得到如下響應(yīng)頭:
HTTP/1.1 302 Found
Location: http://localhost/
如上的重定向代碼在編程里很常用,比如說(shuō)添加文章成功后,跳轉(zhuǎn)回列表頁(yè),不過(guò)這里的重定向狀態(tài)碼302卻是值得商榷的。
這還得從頭說(shuō)起,在HTTP1.0的時(shí)代,那時(shí)候302的名字還是“Moved
Temporarily”,但在實(shí)際使用上,302往往包含了兩方面的意思(也就是后來(lái)的303/307),為了消除可能的混淆,在HTTP1.1
中,302被重命名為“Found”,并新加了303(See Other)和307(Temporary
Redirect),至于PHP之所以在重定向時(shí)缺省使用302狀態(tài)碼是為了兼容的目的,所以不到不得已(有時(shí)候,客戶端是HTTP1.0的,只理解
302),不應(yīng)該使用302。
303和307都把重定向的URI置于Location頭中,他們的區(qū)別在于:
303:對(duì)于POST請(qǐng)求,它表示請(qǐng)求已經(jīng)被處理,客戶端可以接著使用GET方法去請(qǐng)求Location里的URI。
307:對(duì)于POST請(qǐng)求,表示請(qǐng)求還沒(méi)有被處理,客戶端應(yīng)該向Location里的URI重新發(fā)起POST請(qǐng)求。
下面看看PHP如何發(fā)送非302的重定向,以303為例:
// 第一種方法
header('Location: http://localhost/', true, 303);
// 第二種方法
header('HTTP/1.1 303 See Other');
header('Location: http://localhost/');
使用curl命令,你就會(huì)看到如下響應(yīng)頭:
HTTP/1.1 303 See Other
Location: http://localhost/
總結(jié),本文說(shuō)的主要是303/307之間的關(guān)系。之所以明確區(qū)分是為了讓狀態(tài)碼本身能夠準(zhǔn)確的表達(dá)響應(yīng)的含義,從而盡可能的避免對(duì)重定向的濫用。
參考文檔:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
|
|