Les redirections HTTP sont effectuées via les codes HTTP 301 et 302 (peut-être d’autres codes également) et un champ d’en-tête appelé "Emplacement" qui contient l’adresse du nouvel endroit où aller. Cependant, les navigateurs envoient toujours une requête "GET" à cette URL.
Cependant, il est souvent nécessaire de rediriger votre utilisateur vers un autre domaine via POST (paiements bancaires, par exemple). C’est un scénario courant et une nécessité. Est-ce que quelqu'un sait pourquoi une telle exigence commune a été négligée dans la spécification HTTP? La solution consiste à envoyer un formulaire (avec des paramètres dans des champs masqués) avec une action définie sur l'emplacement cible (la valeur du champ d'en-tête Location ) et à utiliser setTimeout
pour soumettre le formulaire à l'emplacement cible.
la source
Réponses:
Dans HTTP 1.1, il existe en réalité un code d'état ( 307 ) qui indique que la demande doit être répétée en utilisant la même méthode et les mêmes données de publication .
Comme d’autres l’ont dit, il existe un risque potentiel d’utilisation abusive, ce qui explique peut-être pourquoi de nombreux cadres restent fidèles aux normes 301 et 302. Cependant, avec une bonne compréhension et une utilisation responsable, vous devriez être capable de réaliser ce que vous cherchez.
Notez que, selon les spécifications de W3.org , lorsque ce
METHOD
n'est pas le casHEAD
ouGET
, les agents utilisateurs doivent informer l'utilisateur avant de réexécuter la demande au nouvel emplacement. Vous devez également fournir une note et un mécanisme de secours à l'utilisateur si les anciens agents utilisateurs ne savent pas quoi faire avec un 307.En utilisant ce formulaire:
Et après avoir Test307.aspx, il suffit de renvoyer 307 avec l'emplacement: http://google.com , Chrome 13 et Fiddler confirment que "test = le test" est effectivement posté sur Google. Bien sûr, la réponse suivante est un 405 puisque Google n'autorise pas le POST, mais cela montre les mécanismes.
Pour plus d'informations, voir Liste des codes d'état HTTP et spécification W3.org .
la source
J'ai trouvé une bonne explication sur cette page ici .
Bien que je ne sois pas fan de la restriction technique des utilisateurs pour les empêcher de causer un chaos indésirable ou de causer des dommages non désirés à leurs applications, je peux comprendre le problème et cela a du sens.
la source
GET (et quelques autres méthodes) sont définis comme "SAFE" dans la spécification http ( RFC 2616 ):
Cela signifie qu'une requête GET ne devrait jamais avoir de conséquence grave pour l'utilisateur, à part voir quelque chose qu'il ne voudrait peut-être pas voir, mais une requête POST pourrait modifier une ressource qui est importante pour lui ou pour d'autres personnes.
Bien que cela ait changé avec JavaScript, il existait généralement différentes interfaces utilisateur - les utilisateurs pouvaient déclencher des requêtes GET en cliquant sur les liens, mais devaient remplir un formulaire pour déclencher une requête POST. Je pense que les concepteurs de HTTP ont tenu à maintenir la distinction entre méthodes sûres et non sûres.
Je pense également qu'il ne devrait jamais être nécessaire de rediriger vers un poste. Toute action à effectuer peut vraisemblablement être effectuée en appelant une fonction dans le code côté serveur ou, si cela doit se produire sur un serveur différent, au lieu d’envoyer une redirection contenant une URL pour le navigateur vers POST, le serveur pourrait faire une demande à ce serveur lui-même, agissant comme un proxy pour l'utilisateur.
la source