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.net
stackoverflow.com/mobile
de.stackoverflow.com
stackoverflow.co.uk/fr
beta.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ę naGET
303 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
.