Хороший способ перенаправления с помощью запроса POST?

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

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


Любые идеи?

Ответ 1

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

  • Пользователь должен создать форму POST на сервере, отличном от вашего собственного

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

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

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

  • Пользователь должен отправлять 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

Ответ 2

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

Здесь SSCCE, просто скопируйте'paste'n'run it:

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

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

Ответ 3

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

Ответ 4

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

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

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