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

提交此GET表单时,参数ab消失了。
是否有原因?
是否有避免这种现象的方法? ?

评论

您的操作元素格式不正确。

它们不应该消失,所以我认为我们需要查看您的表格。

嗨,这是完整的表单,您可以使用此表单创建HTML,然后看到我在操作中传递的参数消失了:


顺便说一句,您知道您缺少该操作值的结尾引号吗?完全不考虑主要问题,但是...

我在这里发布了使用JavaScript的可能解决方法:stackoverflow.com/questions/3548795 / ...

#1 楼


<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中保留任何现有查询字符串。
作为规范(RFC1866,第46页; HTML 4.x第17.13.3节)状态:

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

也许可以对action-URL进行百分比编码以嵌入问号和参数,然后用手指指望所有浏览器将其保留为该URL(并确认服务器也理解该URL)。但是我永远不会依赖它。
顺便说一句:对于非隐藏的表单字段,这没有什么不同。对于POST,操作URL可以包含查询字符串。

评论


@Rob,我还原了您的修改;问题是关于隐藏参数。

– Arjan
7月27日11:38

#2 楼

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

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

,请参阅“ 4.10.22.3表单提交算法”,步骤17。如果使用带有查询字符串的GET表单到http / s URI,则为:


设目的地为与操作相同的新URL,不同之处在于
<query>组件被查询替换(添加U + 003F QUESTION


因此,您的浏览器将破坏URI中现有的“?...”部分,并根据您的表单将其替换为新的。

在HTML 4.01中,该规范生成无效的URI-尽管大多数浏览器实际上并未执行此操作。.

请参见http://www.w3.org/TR/html401/interact/forms .html#h-17.13.3,第4步-URI会有一个?附加,即使它已经包含一个。

评论


意思是:一切都在后面?在动作网址中删除?那么,如果操作URL中的GET参数包含目标,则应在何处处理表单?例如:action =“ index.php?site = search”。我不确定,如果将GET参数放在隐藏的输入字段中是个好主意。

–邦德尔
17年8月24日在13:09

按规格@xyphoid是什么意思?

– AmiNadimi
18年3月7日在10:38

@AmiNadimi:意思是“符合规范”。

–递归
19年6月11日在18:35

#3 楼

您可以在包含GET信息的表上使用简单的foreach。例如在php中:

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


评论


注意:切勿完全按本例使用此示例代码。这将是非常危险的。 GET中的值来自用户,因此不应在不转义的情况下将其写入页面。

– drewm
14年6月18日在9:44

向下投票,直到修复了此代码中的XSS错误为止。

– spookylukey
2014年11月20日14:47

这个答案提供了一个类似的解决方案,但对XSS而言并不脆弱。

–vvzh
16-10-3在5:39



这不处理数组参数

–安德鲁(Andrew)
17年1月11日,下午2:43

#4 楼

您应该将两项(a和b)作为隐藏的输入元素以及C包括在内。

评论


是的,如果可能的话,我当然会这样做。但是可以说我在查询字符串和隐藏输入中都有参数,该怎么办?

–匿名
09年7月12日在13:25

我认为您唯一的选择是解析查询字符串名称/值对并产生隐藏的输入字段。也许如果您对页面和URL的上下文进行了更多描述,我们也许可以提出一个可行的解决方案。

–伯恩哈德·霍夫曼(Bernhard Hofmann)
09年7月13日在14:30

或者,从隐藏的表单项中获取数据,并将其添加到URL和其他查询参数中,然后用简单的定位链接或服务器位置替换表单提交按钮:如果您不想与表单之间进行任何交互,请重定向最终用户。

–詹森
18年2月28日在16:27

#5 楼

我有一个非常相似的问题,在表单操作中,我遇到了类似的问题:

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


该按钮会将用户带到该站点,但是查询信息消失了,所以用户登陆首页而不是所需的内容页面。在我的情况下,解决方案是找出如何在没有查询的情况下对URL进行编码,而该查询会使用户转到所需的页面。在这种情况下,我的目标是Drupal网站,因此事实证明/content/something也可以。我也可以使用节点号(即/node/123)。

#6 楼

如果您需要解决方法,因为此表单可以放置在第三方系统中,则可以使用Apache mod_rewrite如下:

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


,那么您的新表单将如下所示:

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

,Apache将在查询后附加第3个参数

#7 楼

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

”但是可以说我在查询字符串和隐藏输入中都有参数,我可不可以做?”您可以做的是修复错误。别嘲笑,但这有点像在问,“但是可以说我的URL使用百分号而不是斜杠,我该怎么办?”唯一可能的答案是,您可以修复URL。

评论


从技术上讲,整个答案是正确的(“错了,请修复”),但毫无用处。 OP已经知道出了点问题,并在这里询问如何解决。

–詹森
18年2月28日在16:20

对不起,不是很清楚吗? “您不能在表单的操作值中包含参数。”要解决此问题,请从表单的操作值中删除参数。

–杰伊
18年2月28日在17:22

@Jay问题显然是用户需要保留URL参数,因此说“删除它们”将无济于事

–Chuck Le Butt
19/12/12在13:42

@ChuckLeButt说“但是我需要做这个不起作用的事情”并不是一件有用的事情。如果有人告诉我:“我一直在转动收音机旋钮,但我的车不会动”,我唯一想到的回答是:“转动收音机旋钮不会使车动。你必须转动点火钥匙,然后踩油门踏板。”要回答,“但是我需要转动收音机旋钮使汽车行驶”,这是徒劳的。没用它不会工作。

–杰伊
19/12/12在15:21

#8 楼

这是针对Efx的上述帖子的回应:这是对该代码的修改,以防止在URL中复制var:

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


#9 楼

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


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

#10 楼

我通常会这样写:

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


这是可行的,但是别忘了针对XSS攻击清理输入内容!