Jak POST do HTTPs?

Załóżmy, że mam formularz, który w tej chwili robi post:

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

Zauważysz, że nie materen waction, przeglądarka śledzi, skąd wzięła stronę.

Przeglądarka śledzi bieżące reguły domeny

<code>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
</code>

Ale chcę mieć pewność, że przeglądarka zawsze przejdzie dobezpieczne strona:

<code>http://stackoverflow.com/questions/ask   https://stackoverflow.com/questions/ask/submit
</code>

Normalnie spróbujesz czegoś takiego:

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

Poza tym wymaga znajomości nazwy domeny i ścieżki wirtualnej witryny hostingowej (np.stackoverflow.com). Jeśli witryna została zmieniona:

stackoverflow.netstackoverflow.com/mobilede.stackoverflow.comstackoverflow.co.uk/frbeta.stackoverflow.com

następnie formaaction należałoby także zaktualizować:

<code><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">
</code>

Jak mogę poinstruować przeglądarkę, aby się udałahttps wersja astrona?

Hipotetyczna składnia:

<code><form id="post-form" class="post-form" action="https://./questions/ask/submit" method="post">
</code>
302, 303, 307

Pierwotnie302 Found był kodem informującym agenta użytkownika, aby poszedł gdzieś indziej. Intencją było, aby przeglądarki po prostu spróbowały ponownie w nowej lokalizacji:

<code>POST /questions/ask/submit

302 Found
Location: /submitquestion

POST /submitquestion
</code>

Niestety wszystkie przeglądarki źle to zrozumiały i zawsze błędnie używająGET w nowej lokalizacji:

<code>POST /questions/ask/submit

302 Found
Location: /submitquestion

GET /submitquestion
</code>

Ponieważ przeglądarki się pomyliły, utworzono dwa nowe kody:

302 Found: (Legacy przestarzałe) Wypróbuj dokładnie to samo w nowej lokalizacji; ale starsze przeglądarki przełączały się naGET303 See Other: Zapomnij o tym, co robił użytkownik i idź zrobićGET na toLokalizacja307 Temporary Redirect: Wypróbuj dokładnie to samo w nowymLokalizacja (Nie, poważnie, to samo - nie powiedziałem, że możesz się przełączyćGET. Jeśli robiłeśDELETE więc idźDELETE to tutaj.)

Na przykład, jeśli agent użytkownika był w środkuPOST:

<code>| 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         |
</code>

W idealnej sytuacji byłby sposób na wykorzystanie307 See Other powiedzieć agentowi użytkownika, aby spróbowałPOST ponownie w bezpiecznym adresie URL:

<code>POST /questions/ask/submit

302 Found
Location: https://beta.stackoverflow.com/questions/ask/submit

POST /questions/ask/submit
</code>

i mogę uwolnić się od tego wystarczająco dobrze po stronie serwera w ASP.net:

<code>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();
}
</code>

Ale nie wiem, czy możesz określić pełne uri w aLocation.

questionAnswers(2)

yourAnswerToTheQuestion