2008-11-07 45 views
4

現在我們已經有了顯示UI元素的網頁以及僅處理表單提交的網頁,然後重定向回UI頁面。他們使用PHP的header()函數執行此操作:用於功能重定向的HTTP狀態

header("Location: /other_page.php"); 

這會導致發送302 Found響應;根據HTTP 1.1規範,302用於「請求的資源暫時駐留在不同的URI下」的情況。 [HTTP 1.1 spec]

從功能上來說,這很好,但它似乎並沒有像我們正在做的那樣是正確的狀態碼。它看起來像303(「See Other」)在這裏是適當的狀態,所以我想知道是否有任何理由不使用它。我們必須更加明確地使用header(),因爲我們必須指定狀態行,而不僅僅是Location:字段。思考?

回答

8

您可以使用,但適當的StatusCode用於重定向消息後後是303

的混亂有歷史的解釋。最初,302指定瀏覽器不得更改重定向請求的方法。這使得它不適合在瀏覽器發佈GET請求的情況下進行重定向。但是,所有瀏覽器似乎都會誤解規範,並始終發出GET請求。爲了消除歧義,HTTP/1.1指定了兩個新代碼:303和307.730基本上指定了302的事實上的解釋,而307指定了302的原始規範。因此在實踐中302和303是可互換的,並且在理論302和307是​​。

如果你真的照顧有關兼容性,302是一個更安全的賭注比303,因爲HTTP/1.0代理可能不理解303,但所有現代瀏覽器說話HTTP/1.1,所以它不是一個真正的問題。我建議使用303,因爲這是最正確的做法。

在附註上; Location字段應該是完整的URL。在實踐中,這並不重要 - 瀏覽器是寬容的 - 但如果你關心規格,那是正確的做法。

+0

你認爲我會用在語言談判重定向?問題:http://stackoverflow.com/questions/8325784/http-status-code-for-language-redirect – jrosell 2011-11-30 13:39:35

4

,因爲它說,在你的鏈接我從來沒有使用過它自己...:

注:許多預HTTP/1.1用戶代理不 不明白303 狀態。當這樣的客戶的互操作性是一個問題,在 302狀態碼可以替代使用,因爲大多數用戶代理這裏描述爲303

反應 到302響應這似乎是一個好足夠的理由給我堅持使用302

FYI header()需要額外的參數,可以在其中設置狀態代碼:

header('Location: /foo.php', true, 303);

1

要擴大RoBorg的回答,裏許多羅列並不能理解許多HTTP響應代碼中的一小部分。

一個方面的說明:它是所有關心搜索引擎安置,302s可以(據說)導致問題。