2010-04-09 50 views
10

Tôi cần chuyển hướng người dùng đến trang web bên ngoài mặc dù yêu cầu POST.Một cách hay để chuyển hướng bằng yêu cầu POST?

Tùy chọn duy nhất tôi tìm ra là thực hiện việc gửi biểu mẫu thông qua JavaScript.


Bất kỳ ý tưởng nào?

+0

Bạn có thể làm rõ những gì bạn có nghĩa là bằng cách đó? Bạn muốn gửi/chuyển tiếp dữ liệu POST tới một máy chủ khác? Bạn muốn trình duyệt người dùng chuyển hướng sau khi đã gửi yêu cầu? Thứ gì khác...? – deceze

Trả lời

1

Sử dụng biểu mẫu có lẽ là tùy chọn duy nhất của bạn làm liên kết, chuyển hướng HTTP và <meta http-equiv="refresh" > sẽ chỉ khiến trình duyệt tải một URL khác bằng phương thức GET.

Bạn không nhất thiết phải sử dụng JavaScript để gửi biểu mẫu. Nếu một số tương tác của người dùng được chấp nhận, bạn có thể sử dụng biểu mẫu với một số trường <input type="hidden"> và cho phép người dùng nhấn nút gửi.

Bạn cũng có thể muốn đảm bảo rằng trang bạn đang chuyển hướng đến chưa chấp nhận tham số GET. Một số tập lệnh chấp nhận cả GET và POST bừa bãi.

2

Javascript là cách duy nhất (để thực hiện tự động). Bạn chỉ không thể chuyển hướng yêu cầu POST thông qua các phương thức tiêu chuẩn http. Bạn có chắc chắn rằng GET không phải là một tùy chọn ở đây không?

2

Chỉ cần đặt URL hành động của biểu mẫu HTML cho trang web bên ngoài cụ thể.

Dưới đây là một SSCCE, chỉ copy'n'paste'n'run nó:

<!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> 

Bạn sẽ thấy rằng Stackoverflow có bảo vệ CSRF tốt;)

22

Đó không phải là khá rõ ràng những gì ý bạn là, vì vậy, hãy thực hiện một vài trường hợp:

  1. Người dùng phải đăng biểu mẫu tới máy chủ khác với của riêng bạn

    dễ dàng, chỉ cần xác định mục tiêu là hình thức hành động:

    <form action="http://someotherserver.com" method="post"> 
    
  2. tài nên được chuyển hướng sau một POST thành công trình

    dễ dàng, chấp nhận và xử lý dữ liệu POST như thường lệ, sau đó phản hồi với tiêu đề chuyển hướng 302 hoặc 303.

  3. Người sử dụng cần gửi dữ liệu đến máy chủ của bạn, và sau khi xác nhận, bạn muốn POST dữ liệu đó để máy chủ khác

    Hơi khó khăn, nhưng ba lựa chọn:

    • Máy chủ của bạn chấp nhận POST dữ liệu và trong khi người dùng chờ phản hồi, bạn thiết lập kết nối với một máy chủ khác, BẬT dữ liệu, nhận phản hồi, sau đó trả lại câu trả lời cho người dùng.
    • Bạn trả lời bằng chuyển hướng 307, điều này có nghĩa là người dùng nên thử cùng một yêu cầu tại một địa chỉ khác. Về mặt lý thuyết nó có nghĩa là trình duyệt nên POST cùng một dữ liệu đến một máy chủ khác. Tôi không hoàn toàn chắc chắn như thế nào hỗ trợ tốt này là, nhưng bất kỳ sự hiểu biết trình duyệt HTTP1.1 sẽ có thể làm điều đó. AFAIA nó không được sử dụng thường xuyên trong thực tế.
      PS: Đặc điểm kỹ thuật nói rằng chuyển hướng POST 335 cần ít nhất phải được người dùng xác nhận. Than ôi, dường như không có trình duyệt nào dính vào spec ở đây. IE đơn giản lặp lại yêu cầu (vì vậy nó hoạt động cho các mục đích của bạn), nhưng Firefox, Safari và Opera dường như loại bỏ dữ liệu POST. Do đó, kỹ thuật này là tiếc là không đáng tin cậy.
    • Sử dụng kỹ thuật số 1 kết hợp với các trường biểu mẫu ẩn, thêm một bước ở giữa.

Xem ở đây cho một danh sách của tất cả các tùy chọn HTTP chuyển hướng: http://en.wikipedia.org/wiki/Http_status_codes#3xx_Redirection

+0

Tôi tình cờ biết rằng 307 chuyển hướng trên FF19 sẽ khiến Hộp thoại xác nhận xuất hiện. Không chắc chắn về các phiên bản trước đó. – rahulmohan

Các vấn đề liên quan