Las redirecciones HTTP se realizan a través de los códigos HTTP 301 y 302 (quizás también otros códigos) y un campo de encabezado conocido como "Ubicación" que tiene la dirección del nuevo lugar al que ir. Sin embargo, los navegadores siempre envían una solicitud "GET" a esa URL.
Sin embargo, muchas veces necesita redirigir a su usuario a otro dominio a través de POST (pagos bancarios, por ejemplo). Este es un escenario común y realmente un requisito. ¿Alguien sabe por qué un requisito tan común se ha descuidado en la especificación HTTP? La solución consiste en enviar un formulario (con parámetros en campos ocultos) con la acción establecida en la ubicación de destino (el valor del campo de encabezado Ubicación ) y utilizar setTimeout
para enviar el formulario a la ubicación de destino.
fuente
Respuestas:
En HTTP 1.1, en realidad hay un código de estado ( 307 ) que indica que la solicitud debe repetirse utilizando el mismo método y publicar datos .
Como han dicho otros, existe la posibilidad de un mal uso aquí, por lo que muchos marcos se adhieren a 301 y 302 en sus abstracciones. Sin embargo, con la comprensión adecuada y el uso responsable, debería poder lograr lo que está buscando.
Tenga en cuenta que de acuerdo con la especificación W3.org , cuando
METHOD
no esHEAD
oGET
, los agentes de usuario deben avisar al usuario antes de volver a ejecutar la solicitud en la nueva ubicación. También debe proporcionar una nota y un mecanismo alternativo para el usuario en caso de que los agentes de usuario antiguos no estén seguros de qué hacer con un 307.Usando este formulario:
Y tener Test307.aspx simplemente devuelve 307 con la ubicación: http://google.com , Chrome 13 y Fiddler confirman que "test = the test" está publicado en Google. Por supuesto, la respuesta adicional es un 405 ya que Google no permite la POST, pero muestra la mecánica.
Para obtener más información, consulte la Lista de códigos de estado HTTP y la especificación W3.org .
fuente
Encontré una buena explicación en esta página aquí .
Si bien no soy fanático de restringir técnicamente a los usuarios para evitar que causen un caos no deseado o que causen daños no deseados a sus aplicaciones, puedo entender el punto y tiene sentido.
fuente
GET (y algunos otros métodos) se definen como 'SEGURO' en la especificación http ( RFC 2616 ):
Esto significa que una solicitud GET nunca debería tener una consecuencia grave para el usuario, más allá de ver algo que tal vez no quiera ver, pero una solicitud POST podría cambiar un recurso que es importante para ellos o para otras personas.
Aunque esto ha cambiado con JavaScript, tradicionalmente había diferentes interfaces de usuario: los usuarios podían activar solicitudes GET haciendo clic en los enlaces, pero tendrían que completar un formulario para activar una solicitud POST. Creo que los diseñadores de HTTP estaban interesados en mantener la distinción entre métodos seguros y no seguros.
Tampoco creo que deba ser necesario redirigir a una POST. Presumiblemente, cualquier acción que deba llevarse a cabo se puede realizar llamando a una función dentro del código del lado del servidor, o si tiene que suceder en un servidor diferente, en lugar de enviar una redirección que contenga una URL para que el navegador la envíe al servidor. podría hacer una solicitud a ese servidor en sí mismo, actuando como un proxy para el usuario.
fuente