提交查询字符​​串参数的GET表单和隐藏的参数消失

考虑这种forms:

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

提交此表单(GET表单)时,参数a和b正在消失。 这是有原因吗? 有没有办法避免这种行为?

这不是什么隐藏的参数是开始…?

 <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> 

我不会指望任何浏览器在动作URL中保留任何现有的查询string。

如规范( RFC1866 ,第46页; HTML 4.x第17.13.3节)所述:

如果方法是“get”,并且动作是一个HTTP URI,则用户代理将采取action的值,并附加一个“?” 然后附加表单数据集,使用“application / x-www-form-urlencoded”内容types进行编码。

也许可以百分比编码action-URL来embedded问号和参数,然后交叉手指,希望所有的浏览器都会离开这个URL(并validation服务器是否理解它)。 但我永远不会依靠那个。

顺便说一句:这对于非隐藏的表单字段没有什么不同。 对于POST,动作URL可以包含查询string。

在HTML5中,这是每个规范的行为。

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

查看“4.10.22.3表单提交algorithm”,第17步。在查询string的http / s URI的GET表单的情况下:

让目的地成为一个新的URL,除了它的<query>组件被replace为查询(如果合适的话,添加一个U + 003F QUESTION MARK字符(?)),它就等同于该动作。

所以,你的浏览器将会丢弃你的URI中现有的“?…”部分,并根据你的表单来replace它。

在HTML 4.01中,规范产生无效的URI – 大多数浏览器并没有真的这样做,但..

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 ,第四步 – URI将有一个? 追加,即使它已经包含一个。

你可以做的是在包含GET信息的表上使用一个简单的foreach。 例如在PHP中:

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

您应该包含两个项目(a和b)作为隐藏的input元素以及C.

你的build筑是非法的。 您不能在表单的操作值中包含参数。 如果你尝试这样做会发生什么,这将取决于浏览器的怪癖。 如果使用一个浏览器而不是另一个浏览器,我不会感到惊讶。 即使它看起来工作,我也不会依赖它,因为下一个版本的浏览器可能会改变行为。

“但是让我说我​​有查询string和隐藏的input参数,我该怎么办? 你可以做的是修复错误。 不要嗤之以鼻,但这有点像问,“但是让我说我​​的url使用百分号而不是斜杠,我该怎么办? 唯一可能的答案是,您可以修复url。

我有一个非常类似的问题,在forms行动,我有这样的事情:

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

该button将使用户访问该网站,但查询信息消失,因此用户login主页而不是所需的内容页面。 在我的情况下解决scheme是找出如何编码的url,而不会让用户到所需的页面的查询。 在这种情况下,我的目标是一个Drupal网站,所以它/content/something也起作用。 我也可以使用一个节点号码(即/node/123 )。

如果你需要解决方法,因为这个表单可以放在第三方系统中,你可以像这样使用Apache mod_rewrite:

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

那么你的新forms将如下所示:

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

Apache会追加第三个参数来查询

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

将请求方法更改为“POST”而不是“GET”。

这是对Efx上面的post的回应:

如果URL已经包含了你想改变的variables,那么它又被添加为隐藏字段。

以下是对该代码的修改,以防止在URL中重复使用variables:

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

我通常写这样的东西:

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

这是行得通的,但不要忘记消除XSS攻击的input!