2010-03-24 24 views
2

我已經創建了一個表單(所以它是PHP和HTML混合代碼)。它有能力發送'$ _POST'。當我點擊它時,它可以很好地發送和顯示輸入。Ctrl + r在Firefox中刷新頁面和我的php代碼

但有什麼東西,當我在Firefox中單擊按Ctrl +[R爲represhing頁面發生。我得到這個confim對話框:「要顯示此頁面,火狐必須發送將重複任何操作(如搜索或訂單確認)信息進行較早

我的問題

  1. 什麼(這確認對話框?)
  2. 我必須對我的代碼做什麼,所以它能夠抑制這個對話框?
+0

@all:Thiaks你所有的答案。我很抱歉,我只能從很多好的答案中接受一個答案;( – justjoe 2010-03-24 04:42:38

回答

6

您可能已經創建了一個包含HTML頁面一個<form>。該表單用於將數據發送到HTTP服務器(即託管站點的Web服務器)。

HTTP協議定義了用於將數據發送到服務器和從服務器檢索數據的不同請求類型。最常用的是GETPOST。如果你想成爲一個非常不好的PHP程序員,那麼不幸的是(或者幸運的是,如果你在黑客一方)非常普遍,你必須瞭解所有這些。

您的問題是Firefox發送POST請求後到達您正在討論的頁面。如果您重新加載頁面,它必須以POST的形式再次發送相同的數據。由於關於POST請求應該用於什麼(通常用於修改數據庫上的數據)的慣例,瀏覽器詢問用戶他是否確定他想做什麼。

主要有兩種選擇規避這一點:

  1. 變化形式方法來獲取;或
  2. POST後使用重定向。

要使用第一種方法,你可以簡單地一個method="get"參數添加到您的表單標籤:

​​

要使用第二種方法,你只要將POST請求後的用戶,使用類似

header("Location: blahblahblah") 

最常用的模式是POST-Redirect,也就是我告訴過你的第二種方法。有許多安全隱患使用GET更改數據庫中的數據(如果你有興趣的是,,你是應該的,因爲每個PHP程序員應該,瞭解XSRF)。

+3

非常完整和詳細的答案。確實如此完整,我很驚訝沒有提及HTTP 303狀態代碼的適當性( http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4)的POST重定向模式:「此方法的存在主要是爲了允許輸出POST激活的腳本來重定向用戶代理到選定的資源「 – 2010-03-24 04:44:01

+0

非常感謝你的回答,甚至給出了一些微妙的信息,我不問,但我真的需要知道:關於最常用的模式是POST-Redirect; D – justjoe 2010-03-24 04:44:04

+0

btw,其中我應該去學習基本的XSRF嗎? – justjoe 2010-03-24 04:54:51

3

提交表單(發送POST請求)通常用於確認電子商務網站上的訂單。因此,提交兩次將提交訂單,兩次。因此,瀏覽器傾向於要求確認用戶想要再次發送POST請求。

爲了防止這種情況,您需要使刷新做GET請求而不是POST請求。爲此,只需在處理表單後重定向到同一頁面即可。

header("Location: /path/to/self"); 

這將使得當用戶點擊刷新時,它將發送GET請求而不是POST請求,並且它不會提示進行確認。


要clairify,它是這樣的:

  • 形式得到通過通過POST(用戶點擊形式)
  • 形式得到處理
  • 用戶被重定向到同一個頁面(發送GET)
  • 用戶現在將刷新GET請求而不是POST請求。
2

我想每當你的形式(PHP,平均價格,靜態html等)包含可以任一種形式字段的Infor或其他,被髮送到經由火狐服務器發佈信息時,它再次發送數據之前顯示這樣的消息到服務器。它充當Mozilla開發人員的安全保護。我想它可以通過about:config禁用,但不建議這樣做。

此外這是一個正常的行爲。它應該是這樣的,並且在firefox中已經很長時間了。

你可能想看看這裏: http://forums.mozillazine.org/viewtopic.php?f=38&t=682835&st=0&sk=t&sd=a&hilit=Firefox+must+send

選擇使用GET而不是POST發送數據...

問候

0

如果表單已成功提交,回答與status code 303

header('Location: http://www.example.com/', TRUE, 303); 

這迫使瀏覽器來使用的結果頁的GET請求。重新加載不會發送任何POST數據,並且不顯示彈出窗口。