soumettre un formulaire GET avec la chaîne de requête params et params cachés disparaissent

Considérer cette forme:

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

lors de la soumission de ce formulaire (un formulaire GET) Les Paramètres A et b sont en train de disparaître. Est-il une raison pour que? Est-il un moyen d'éviter ce comportement?

190
demandé sur Kiquenet 2009-07-12 17:09:36

10 réponses

N'est pas ce que les paramètres cachés sont pour commencer...?

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

Je ne compterais pas sur un navigateur pour conserver une chaîne de requête existante dans L'URL d'action.

As the specifications ( RFC1866 , page 46; HTML 4.x section 17.13.3):

si la méthode est "get" et que L'action est une URI HTTP, l'agent utilisateur prend la valeur d'action, ajoute un"?'à elle, puis ajoute le jeu de données de forme, encodé en utilisant le type de contenu" application/x-www-form-urlencoded".

peut-être que l'on pourrait cent-encoder L'action-URL pour intégrer le point d'interrogation et les paramètres, et puis croiser les doigts pour espérer que tous les navigateurs laisseraient cette URL comme il (et valider que le serveur le comprend aussi). Mais je n'avais jamais compter sur cela.

soit dit en passant: ce n'est pas différent pour les champs non cachés. Pour le POST L'URL d'action pourrait contenir une chaîne de requête cependant.

220
répondu Arjan 2009-07-12 14:21:01

En HTML5, c'est par-spec comportement.

voir http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithm

regarder "4.10.22.3 algorithme de soumission des formulaires", étape 17. Dans le cas d'un formulaire GET d'un http/s URI avec une chaîne de requête:

laisser la destination être une nouvelle URL qui est égale à l'action sauf que son <query> le composant est remplacé par query (ajout D'une QUESTION U+003F) D'interrogation (?) le cas échéant).

alors, votre navigateur va détruire l'existant "?..."faites partie de votre URI et remplacez-le par un nouveau basé sur votre forme.

en HTML 4.01, le spec produit des URIs Invalides - la plupart des navigateurs ne l'ont pas fait..

voir http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 , step quatre-L'URI aura un ? annexe, même si elle en contient déjà une.

59
répondu xyphoid 2016-10-25 03:40:29

ce que vous pouvez faire est d'utiliser un simple foreach sur la table contenant les informations GET. Par exemple en php:

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}
16
répondu Efx 2012-01-06 19:53:10

vous devez inclure les deux éléments (a et b) comme éléments d'entrée cachés ainsi que C.""

5
répondu Bernhard Hofmann 2009-07-12 13:16:10

j'ai eu un problème très similaire où pour l'action de forme, j'ai eu quelque chose comme:

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

le bouton permettrait à l'utilisateur de se rendre sur le site, mais l'information de requête a disparu de sorte que l'Utilisateur a atterri sur la page d'accueil plutôt que sur la page de contenu souhaitée. La solution dans mon cas était de savoir comment coder l'URL sans la requête qui doit amener l'utilisateur à la page souhaitée. Dans ce cas, ma cible était un site Drupal, donc comme il s'est avéré /content/something a également fonctionné. Je aurait aussi pu utiliser un numéro de noeud (par exemple /node/123 ).

1
répondu KillerRabbit 2011-09-07 17:26:24

votre construction est illégale. Vous ne pouvez pas inclure de paramètres dans la valeur d'action d'un formulaire. Qu'advient-il si vous essayez cela va dépendre des caprices du navigateur. Je ne serais pas surpris que ça marche avec un navigateur et pas avec un autre. Même si cela semblait fonctionner, Je ne m'y fierais pas, parce que la prochaine version du navigateur pourrait changer le comportement.

" mais disons que j'ai des paramètres dans la chaîne de requête et dans les entrées cachées, Que puis-je faire?"Ce que vous pouvez faire est la correction de l'erreur. Ne pas être sniffe, mais c'est un peu comme demander, "mais disons que mon URL utilise des signes pour cent au lieu de slashes, Que puis-je faire?"La seule réponse possible est que vous pouvez corriger L'URL.

1
répondu Jay 2011-09-07 17:45:13

si vous avez besoin d'une solution de contournement, comme ce formulaire peut être placé dans des systèmes tiers, vous pouvez utiliser Apache mod_rewrite comme ceci:

RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L]

alors votre nouveau formulaire ressemblera à ceci:

<form ... action="http:/www.blabla.com/dummy.link" method="GET">
<input type="hidden" name="c" value="3" /> 
</form>

et Apache ajoutera le troisième paramètre à la requête

0
répondu wanis 2013-05-07 09:36:13

C'est en réponse au post ci-dessus par Efx:

si L'URL contient déjà le var que vous voulez changer, alors il est ajouté à nouveau comme un champ caché.

voici une modification de ce code pour empêcher la duplication de vars dans L'URL:

foreach ($_GET as $key => $value) {
    if ($key != "my_key") {
        echo("<input type='hidden' name='$key' value='$value'/>");
    }
}
-2
répondu TonyH 2015-04-14 22:36:46
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

changez la méthode request en' POST' au lieu de 'GET'.

-4
répondu Shashidhar Gr 2013-09-07 07:29:37

j'écris habituellement quelque chose comme ceci:

foreach($_GET as $key=>$content){
        echo "<input type='hidden' name='$key' value='$content'/>";
}

cela fonctionne, mais n'oubliez pas de nettoyer vos entrées contre les attaques XSS!

-4
répondu Rápli András 2014-02-16 01:02:50