Предположим, что у меня есть форма, которая прямо сейчас делает сообщение:
<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 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
в этом Location307 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
.