2010-04-09 483 views
10

我需要通過POST請求將用戶重定向到外部網站。使用POST請求重定向的好方法?

我想出的唯一選擇是通過JavaScript提交表單。


任何想法?

+0

你能澄清你的意思嗎?你想發送/轉發POST數據到另一臺服務器?您希望用戶瀏覽器在發佈請求後重定向?別的東西...? – deceze 2010-04-09 02:49:14

回答

1

使用表格可能是您唯一的選擇作爲鏈接,HTTP重定向和<meta http-equiv="refresh" >只會導致瀏覽器使用GET方法加載另一個URL。

儘管您不一定要使用JavaScript來提交表單。如果某些用戶交互是可接受的,則可以使用帶有一些<input type="hidden">字段的表單,並讓用戶按提交按鈕。

您可能還希望確保您重定向到的頁面尚未接受GET參數。 某些腳本不分青紅皁白地接受GET和POST。

2

JavaScript是唯一的方法(自動執行)。您無法通過標準http方法重定向POST請求。你確定GET不是這裏的選項嗎?

2

只需將HTML表單的操作URL設置爲特定的外部網站即可。

下面是一個SSCCE,只是copy'n'paste'n'run它:

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>SO question 2604530</title> 
    </head> 
    <body> 
     <form action="http://stackoverflow.com/questions/2604530/answer/submit" method="post"> 
      <textarea name="post-text"></textarea> 
      <input type="submit" value="Post Your Answer"> 
     </form> 
    </body> 
</html> 

你會看到,#2具有良好的CSRF保護;)

22

這不是很清楚你的意思是,讓我們先來幾個可能性:

  1. 用戶應該張貼的形式不是您自己的服務器

    非常容易,只要指定目標作爲表單動作:

    <form action="http://someotherserver.com" method="post"> 
    
  2. 用戶一個成功的POST之後重定向提交

    簡單,接受和處理POST數據像往常一樣,然後用302303重定向標題進行響應。

  3. 用戶應該POST數據到您的服務器,並驗證後,你要發佈的數據到另一臺服務器

    有點難,但三個選項:

    • 你的服務器接受POST數據,當用戶等待響應時,您建立到另一個服務器的連接,發佈數據,接收響應,然後向用戶返回答案。
    • 你用一個307重定向來回答,這意味着用戶應該在另一個地址嘗試相同的請求。理論上這意味着瀏覽器應該將相同的數據發送到另一臺服務器。我不太清楚這是多麼的支持,但任何瀏覽器理解HTTP1.1應該能夠做到這一點。 AFAIA在實踐中並沒有經常使用。
      PS:該規範說明,307 POST重定向需要至少被用戶確認。唉,顯然這裏沒有瀏覽器堅持規範。 IE只是重複請求(所以它適用於你的目的),但Firefox,Safari和Opera似乎放棄了POST數據。因此,這種技術不幸是不可靠的。
    • 使用技術#1結合隱藏的表單域,在兩者之間添加一個步驟。

在這裏看到的所有HTTP重定向選項的列表:http://en.wikipedia.org/wiki/Http_status_codes#3xx_Redirection

+0

我碰巧知道在FF19上重定向307會導致確認對話框出現。不確定早期版本。 – rahulmohan 2013-05-10 20:26:09