¿Cómo POST a HTTPs?
Supongamos que tengo un formulario que en este momento está haciendo una publicación:
<code><form id="post-form" class="post-form" action="/questions/ask/submit" method="post"> </code>
Notarás que no haysitio en elaction
, el navegador sigue de donde sacó la página.
El navegador sigue las reglas de dominio actuales al publicar
<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>
Pero quiero asegurarme de que el navegador siempre vaya a laseguro página:
<code>http://stackoverflow.com/questions/ask https://stackoverflow.com/questions/ask/submit </code>
Normalmente intentarías algo como:
<code><form id="post-form" class="post-form" action="https://stackoverflow.com/questions/ask/submit" method="post"> </code>
Excepto que eso requiere conocer el dominio y el nombre de la ruta virtual del sitio de alojamiento (por ejemplo,stackoverflow.com
). Si el sitio fuera cambiado:
stackoverflow.net
stackoverflow.com/mobile
de.stackoverflow.com
stackoverflow.co.uk/fr
beta.stackoverflow.com
entonces la formaaction
Tendría que ser actualizado también:
<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>
¿Cómo puedo ordenar al navegador que vaya ahttps
versión de unpágina?
Sintaxis hipotética:
<code><form id="post-form" class="post-form" action="https://./questions/ask/submit" method="post"> </code>302, 303, 307
Originalmente302 Found
fue el código para decirle al agente de usuario que vaya a otro lugar. La intención era que los navegadores simplemente volvieran a intentarlo en la nueva ubicación:
<code>POST /questions/ask/submit 302 Found Location: /submitquestion POST /submitquestion </code>
Desafortunadamente, todos los navegadores se equivocaron, y siempre usaríanGET
en la nueva ubicación:
<code>POST /questions/ask/submit 302 Found Location: /submitquestion GET /submitquestion </code>
Debido a que los navegadores se equivocaron, se crearon dos nuevos códigos:
302 Found
: (Legado en desuso) Intente exactamente lo mismo otra vez en la nueva ubicación; pero los navegadores antiguos estaban cambiando aGET
303 See Other
: Olvida lo que el usuario estaba haciendo y ve a hacerGET
en esteUbicación307 Temporary Redirect
: Intenta exactamente lo mismo otra vez en el nuevoUbicación (No, en serio, lo mismo. No dije que pudieras cambiar aGET
. Si estuvieras haciendo unDELETE
entonces veteDELETE
por aquí.)Por ejemplo, si el agente de usuario estaba en medio de unaPOST
:
<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>
Idealmente, habría una forma de usar307 See Other
para decirle al agente de usuario para probar elPOST
de nuevo en la URL segura:
<code>POST /questions/ask/submit 302 Found Location: https://beta.stackoverflow.com/questions/ask/submit POST /questions/ask/submit </code>
y puedo salirme con la suya del servidor en 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>
Pero no sé si puede especificar un uri completo en unLocation
.