Как выполнить POST для HTTP?

Предположим, что у меня есть форма, которая прямо сейчас делает сообщение:

<form id="post-form" class="post-form" 
      action="/questions/ask/submit" method="post">

Вы заметите, что в нет сайта. ] actionбраузер отслеживает, откуда он взял страницу.

При размещении сообщений браузер следует текущим правилам домена.

If the current page is...                then the browser will POST to
=======================================  =============
http://stackoverflow.com/questions/ask   http://stackoverflow.com/questions/ask/submit
https://stackoverflow.com/questions/ask  https://stackoverflow.com/questions/ask/submit

Но я хочу убедиться, что браузер всегда переходит на безопаснуюстраницу:

http://stackoverflow.com/questions/ask   https://stackoverflow.com/questions/ask/submit

Обычно вы должны попробовать что-то вроде:

<form id="post-form" class="post-form" 
      action="https://stackoverflow.com/questions/ask/submit" method="post">

За исключением для этого необходимо знать домен и виртуальный путь к хост-сайту (например, stackoverflow.com). Если сайт был изменен:

  • stackoverflow.net
  • stackoverflow.com/mobile
  • de.stackoverflow.com
  • stackoverflow.co.uk/fr
  • beta.stackoverflow.com

тогда форма actionтакже должна быть обновлена:

<form id="post-form" class="post-form" action="https://stackoverflow.net/questions/ask/submit" method="post">

<form id="post-form" class="post-form" action="https://stackoverflow.com/mobile/questions/ask/submit" method="post">

<form id="post-form" class="post-form" action="https://de.stackoverflow.com/questions/ask/submit" method="post">

<form id="post-form" class="post-form" action="https://stackoverflow.co.uk/fr/questions/ask/submit" method="post">

<form id="post-form" class="post-form" action="https://beta.stackoverflow.com/questions/ask/submit" method="post">

Как я могу указать браузеру перейти на httpsверсию страницы ?


Гипотетический синтаксис:

<form id="post-form" class="post-form" action="https://./questions/ask/submit" method="post">

302, 303, 307

Первоначально 302 Foundбыл кодом, указывающим агенту пользователя перейти куда-то еще.Намерение состояло в том, чтобы браузеры просто повторили попытку в новом местоположении:

POST /questions/ask/submit

302 Found
Location: /submitquestion

POST /submitquestion

К сожалению, все браузеры ошиблись и всегда по ошибке использовали GETв новом местоположении:

POST /questions/ask/submit

302 Found
Location: /submitquestion

GET /submitquestion

Поскольку браузеры ошиблись, были созданы два новых кода:

  • 302 Найдено: (устаревший код устарел)Попробуйте повторить то же самое еще раз в новом месте; но устаревшие браузеры переключались на GET
  • 303 See Other: забудьте о том, что делал пользователь, и выполните GETв этом Location
  • 307 Temporary Redirect :Попробуйте повторить то же самое еще раз в новом Местоположение(Нет, серьезно, то же самое — я не говорил, что вы можете переключиться на GET. Если вы выполняли DELETE, затем перейдите DELETEсюда.)

Например, если пользовательский агент был в середине POST:

| Response               | What agent should do  | What many agents actually do |
|------------------------|-----------------------|------------------------------|
| 302 Found              | POST to new Location  | GET from new Location        |
| 303 See Other          | GET from new Location | GET from new Location        |
| 307 Temporary Redirect | POST to new Location  | POST to new Location         |

В идеале должен быть способ использовать 307 Temporary Redirect, чтобы сказать пользовательскому агенту, чтобы он снова попробовал POSTпо безопасному URL-адресу:

POST /questions/ask/submit

307 Temporary Redirect
Location: https://beta.stackoverflow.com/questions/ask/submit

POST /questions/ask/submit

, и я могу уйти с это достаточно хорошо на стороне сервера в ASP.net:

if (!Request.IsSecureConnection)
{
   string redirectUrl = Request.Url.ToString().Replace("http:", "https:");
   Response.Redirect(redirectUrl);

   //We don't want to send the client the deprecated 302 code, we want to use 307 telling them that we really want them to continue the POST, PUT, DELETE, etc
   Response.StatusCode = (int)System.Net.HttpStatusCode.TemporaryRedirect;     
   Response.End();
}

Но я не знаю, можете ли вы указать полный uri в Location.

10
задан Ian Boyd 31 May 2019 в 14:42
поделиться