考虑以下形式:
<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.blabla.com?a=1&b=2" method="GET">
<input type="hidden" name="c" value="3" />
</form>
提交此表单(GET表单)时,参数a和b消失。有什么理由吗?有办法避免这种行为吗?
Answers:
这不是什么隐藏参数以...开始吗?
<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可以包含查询字符串。
在HTML5中,这是按规范的行为。
查看“ 4.10.22.3表单提交算法”,第17步。对于带有查询字符串的GET表单到http / s URI的情况:
令destination为一个等于该操作的新URL,不同之处在于它的
<query>
组成部分被查询替换(适当时添加U + 003F QUESTION MARK字符(?))。
因此,您的浏览器将废弃URI中现有的“?...”部分,并根据您的表单将其替换为新的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参数放在隐藏的输入字段中是个好主意。
您可以在包含GET信息的表上使用简单的foreach。例如在php中:
foreach ($_GET as $key => $value) {
echo("<input type='hidden' name='$key' value='$value'/>");
}
您应该将两项(a和b)作为隐藏的输入元素以及C包括在内。
Location:
如果您不希望与最终用户进行任何交互,则可以重定向服务器。
我有一个非常类似的问题,对于表单操作,我有类似以下内容:
<form action="http://www.example.com/?q=content/something" method="GET">
<input type="submit" value="Go away..." />
</form>
该按钮会将用户带到该站点,但是查询信息消失了,因此用户登陆了主页而不是所需的内容页面。在我的情况下,解决方案是找出如何在没有查询的情况下对URL进行编码,而该查询会使用户转到所需的页面。在这种情况下,我的目标是Drupal网站,因此事实证明/content/something
也可行。我也可以使用节点号(即/node/123
)。
您的建筑是非法的。您不能在表单的操作值中包含参数。如果尝试这种操作,将发生什么情况将取决于浏览器的怪癖。如果它适用于一个浏览器而不适用于另一个浏览器,我不会感到惊讶。即使它看起来可行,我也不会依赖它,因为下一版浏览器可能会改变行为。
“但是可以说我在查询字符串和隐藏输入中都有参数,我该怎么办?” 您可以做的是修复错误。别嘲笑,但这有点像在问,“但是可以说我的URL使用百分号而不是斜杠,我该怎么办?” 唯一可能的答案是,您可以修复URL。
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" />
</form>
将请求方法更改为“ POST”而不是“ GET”。
我通常会这样写:
foreach($_GET as $key=>$content){
echo "<input type='hidden' name='$key' value='$content'/>";
}
这是可行的,但是请不要忘记对XSS攻击清除输入内容!