如果<form>标签中的操作字段带有参数,会发生什么?

42

如果我在 HTML 中执行以下操作,是否有一种被广泛支持的常见行为可以预期:

<form method="get" action="/somePage.html?param1=foo&param2=foo">
  <input name="param2"></input>
  <input name="param3"></input>
</form>

看起来这种做法本质上是荒谬的,但我在这里和那里看到过它的使用,我想知道预期行为是什么。浏览器是否足够聪明,可以将"&param2=whatever&param3=whatever"附加到操作中,还是只会加入第二个问号?还是其他情况?是否有时候这样做才是正确的方式?


如果您正在使用 Apache 并需要解决方法,可以在另一个 StackOverflow 答案中找到。 - wanis
1
这个回答解决了你的问题吗?当提交GET表单时,查询字符串会从操作URL中删除 - miken32
相关:带查询参数的POST请求 - undefined
4个回答

71
如果method属性被设置为GET,浏览器在构造表单参数值之前会从action属性中删除查询字符串参数。因此,在您的示例中,提交到服务器的请求将如下所示:/somePage.html?param2=value&param3=value。因此,当方法为“GET”时,与您的示例一样,没有必要这样做。

4
如果方法属性设置为POST,则两者都将被保留。向服务器的请求将在查询字符串中具有param1=foo&param2=foo,并且作为已发布的表单值,param2(具有不同的值)和param3也将被保留。 - thomasrutter
@thomasrutter非常正确!我认为这略微超出了本讨论的范围。有趣的部分是明显的碰撞。 - Rex M
1
@Rex - 我认为GET和POST的行为不同很有趣。这是我没有预料到的。这背后是否有逻辑上的原因? - Brandon Yarbrough
2
@CaptainAwesomePants - 根据定义,使用“GET”需要使用查询字符串。最简单的无风险处理方式是先清除任何已有内容。而“POST”不需要查询字符串,因此无需移除它以节省空间。 - Rex M
如果输入字段中没有 param2,它是否仍会首先删除 param2 - WoooHaaaa

27

我不确定,但我认为将这些变量放在隐藏的输入字段中是更好的实践。这样无论您的发布方法是POST还是GET都不会有问题。

<form method="get" action="/somePage.html">
  <input name="param2"></input>
  <input name="param3"></input>
  <input type="hidden" name="param1" value="foo" />
  <input type="hidden" name="param2" value="foo" />
</form>

不存在无名参数这样的东西;你可以有一个没有值的参数。比如 &param1=foo&param2&param3=bar - Kamafeather

4
您可以在提交表单之前使用脚本将表单中的方法属性更改为“POST”,这样查询字符串在操作中就有用处了。不过,这似乎并不是任何问题的最佳解决方案。

3

好的,除了最后一个问题之外,所有问题都已经得到回答。对于 POST,它是允许的,但你可能会发现有些情况下它不起作用。我曾经见过一些只允许 postdata 查询字符串的 web 服务器,所以这并不可靠。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接