2013-07-12 45 views
12

預期POST的正確行爲是什麼=> 302重定向到GET?什麼是預期的HTTP POST => 302重定向到GET的正確行爲?

在Chrome(可能每一個瀏覽器最),我POST之後(該要我重定向資源),我收到一個302重定向,瀏覽器會自動在302位置的GET。這甚至是well known pattern。但是我閱讀規範的方式,似乎表明這不應該發生。

The HTTP spec says

如果接收響應302個的狀態碼比 GET或HEAD,用戶代理其他的請求必須不能自動重定向的 請求除非它可以被確認用戶,因爲這可能會改變發出請求的條件。

而小提琴手正顯示出:以上

REQUEST 1: POST URLA 
RESPONSE 1: 302 redirect to URLB 
REQUEST 2: GET URLB 

的部分似乎是說,瀏覽器不應該讓GET請求?我錯過了什麼?

  1. 前面的東西在規範中,使這部分無關緊要
  2. 我理解的自動重定向是錯誤的(以及做了Chrome瀏覽器的GET並沒有真正自動重定向)
  3. 我證實了這一點認識作爲用戶
  4. 還有其他?

回答

13

在規範的第二天行開始:

注:RFC 1945和RFC 2068指定客戶端不允許 改變方法的重定向請求。然而,大多數現有 用戶代理實現對待302,好像它是一個303 響應,而不管對所述位置字段值一個GET原始請求方法的 。狀態碼303和307都 添加了希望就毫不含糊地明確其 樣的反應,預計客戶端的服務器。

緊接着,它解釋了303應該如何處理,這正是你所看到的。


如果你問爲什麼服務器仍在使用的302,而不是307,所有的瀏覽器會將正確處理,這是因爲舊的瀏覽器將無法處理它。如果你想知道爲什麼瀏覽器把302作爲303來處理,那是因爲舊服務器期待它。這個循環確實沒有辦法,而且HTTP可能會更好地恢復302以表示它以前的含義,並且將其棄用(對於非GET/HEAD)而偏向於307。

+1

abarnet:請說明您是 「舊的瀏覽器」 的意思。 –

+0

@JulianReschke:我不完全清楚。如果我不得不猜測,我猜這個年份是在IE6和FF1.9左右。但請記住,桌面瀏覽器(和WebKit移動瀏覽器)不是唯一的用戶代理;有很多人在使用其他瀏覽器的設備,手動編碼的Web服務客戶端或者抓取工具等。 – abarnert

+0

@JulianReschke:另外,我應該提到303和307只在HTTP/1.1中。有很多服務器和緩存(以及一些用戶代理),無法處理1.1或禁用它。同時,我剛剛發現[博客文章](http://blogs.msdn.com/b/ieinternals/archive/2011/08/19/understanding-the-impact-of-redirect-response-status-codes-on- http-methods-like-head-get-post-and-delete.aspx)來自與看起來相關的IE團隊。 – abarnert

0

abarnert是對的!我遇到了與Google App Engine相同的問題,但我找到了一個不同的解決方案。

我的問題與appengine是,我做了一個表單後處理GO formHandler POST。但它被執行如下。

請求1:GET/formHandler - >響應1:302實測值

請求1:POST/formHandler - >響應1:302實測值

請求1:GET/formHandler - >響應1:200好。

Additionaly我

否「訪問控制允許來源」標頭出現在所請求的資源

這是一個CORS問題。

但是,解決方案證明使用HTTP S而不是HTTP。

然後,你將有

請求:POST/formHandler - >響應:200 OK