Хороший способ перенаправить с запросом POST? - PullRequest
14 голосов
/ 09 апреля 2010

Мне нужно перенаправить пользователя на внешний сайт через POST-запрос.

Единственный вариант, который я нашел, - это отправить форму через JavaScript.


Есть идеи?

Ответы [ 4 ]

32 голосов
/ 09 апреля 2010

Не совсем понятно, что вы имеете в виду, поэтому давайте рассмотрим несколько сценариев:

  1. Пользователь должен отправить форму на сервер, отличный от вашего собственного

    Легко, просто укажите цель как действие формы:

    <form action="http://someotherserver.com" method="post">
    
  2. Пользователь должен быть перенаправлен после успешной отправки POST

    Легко, примите и обработайте данные POST как обычно, затем ответьте заголовком перенаправления 302 или 303.

  3. Пользователь должен отправить данные на ваш сервер, и после проверки вы хотите отправить эти данные на другой сервер

    Немного хитрый, но три варианта:

    • Ваш сервер принимает данные 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

4 голосов
/ 09 апреля 2010

Просто установите URL-адрес действия формы HTML для определенного внешнего сайта.

Вот SSCCE , просто скопируйте и запустите его:

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2604530</title>
    </head>
    <body>
        <form action="/1447307/horoshii-sposob-perenapravit-s-zaprosom-post" method="post">
            <textarea name="post-text"></textarea>
            <input type="submit" value="Post Your Answer">
        </form>
    </body>
</html>

Вы увидите, что Stackoverflow имеет хорошую защиту от CSRF;)

2 голосов
/ 09 апреля 2010

Javascript - единственный способ (сделать это автоматически). Вы просто не можете перенаправить POST запрос стандартными http методами. Вы уверены, что GET здесь не вариант?

0 голосов
/ 09 апреля 2010

Использование формы, вероятно, является единственным вариантом, поскольку ссылки, перенаправления HTTP и <meta http-equiv="refresh" > заставят браузер загружать другой URL-адрес только с помощью метода GET .

Вам не обязательно использовать JavaScript для отправки формы. Если какое-либо взаимодействие с пользователем приемлемо, вы можете использовать форму с некоторыми полями <input type="hidden"> и позволить пользователю нажать кнопку отправки.

Вы также можете убедиться, что страница, на которую вы перенаправляете, не принимает параметры GET. Некоторые сценарии принимают как GET, так и POST без разбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...