提交表单时从 URL 中删除 %5B%5D
Posted
技术标签:
【中文标题】提交表单时从 URL 中删除 %5B%5D【英文标题】:Remove %5B%5D from URL when submitting form 【发布时间】:2012-12-19 02:38:27 【问题描述】:当我提交一个包含多个同名复选框的表单时,我会得到一个如下所示的 URL: www.mysite.com/search.php?myvalue%5B%5D=value1&myvalue%5B%5D=value2
有什么方法可以删除 %5B%5D 以使 URL “漂亮”,例如 htaccess?
代码:
<form>
<input type="checkbox" name="myvalue[]" value="value1">
<input type="checkbox" name="myvalue[]" value="value2">
</form>
【问题讨论】:
请发布您的代码,然后我们也许可以解决%5B%5D
的原因
我知道为什么会得到它,只是不知道如何将 URL 重写为更简单、更短的 URL。
只有当你出于某种不清楚的原因实际上在两个元素中都使用了name="myvalue[]"
时才会发生这种情况(也许是为了“轻松”利用 PHP 特有的奇怪功能从请求参数映射中获取数组?),但似乎并非如此。您是否使用了一些负责生成/操作 html 输出的 MVC 框架?
Oskwish,我不是那个意思。只有当您实际使用了name="myvalue[]"
时,URL 中的%5B%5D
才会出现。如果您正在使用name="myvalue"
,正如您在问题中所展示的那样,它不应该出现(换句话说,到目前为止发布的代码根本不会导致所描述的问题,因此您在问题中有一个巨大的红鲱鱼因此这个问题实际上是无效的)。
如果您不希望 URL 中包含这些值,请使用发布请求。一个更好的主意是停止关心您的 URL 的外观。
【参考方案1】:
有什么方法可以删除 %5B%5D 以使 URL “漂亮”,例如 htaccess?
没有。 []
在 URL 中是 reserved characters,所以它们肯定需要是 URL-encoded。
如果使用 POST 不是一个选项,考虑到它是一个搜索表单,这是有道理的,你最好的办法是给它们每个不同的名称,其值约为 1。
<form>
<input type="checkbox" name="option1" value="1" />
<input type="checkbox" name="option2" value="1" />
</form>
或者,如果您真的坚持它们具有相同的名称,那么您应该自己提取查询字符串,而不是在获取名称中带有[]
后缀的参数时依赖于返回数组的 PHP 特定功能.
$params = explode('&', $_SERVER['QUERY_STRING']);
foreach ($params as $param)
$name_value = explode('=', $param);
$name = $name_value[0];
$value = $name_value[1];
// ... Collect them yourself.
这样你就可以继续使用无括号的名字了。
<form>
<input type="checkbox" name="option" value="option1" />
<input type="checkbox" name="option" value="option2" />
</form>
【讨论】:
"不。[] 是 URL 中的保留字符,因此肯定需要对它们进行 URL 编码。" - 上面的 BalusC。 但是,如果我手动编写 URL 并将[]
而不是 %5B%5D
它仍然有效。
在手动输入 URL 时,是网络浏览器本身将其隐藏起来。顺便说一句,如果您使用 JSP/Servlet 而不是 PHP,您可以将 name="myvalue"
与 request.getParameterValues("myvalue")
结合使用。另见:***.com/questions/1928675/…[]
在 PHP 中是强制性的,这实际上是 PHP 特定的“怪癖”。【参考方案2】:
[
和 ]
是 URL 中的保留字符,因此浏览器必须对它们进行编码才能使 URL 正常工作。 URL 中不能包含这些字符。您也不能有任何其他保留字符,例如空格、& 号等。它们都会自动为您编码(在许多情况下,即使您在浏览器中手动键入 URL)。
如果你需要一个“漂亮的 URL”,你可以:
根本不使用表格;提供一个指向已知“漂亮”网址的链接。
接受丑陋的 URL,但立即将其重定向到上面第 1 点中的漂亮 URL。
避免在字段名称中使用尖括号(但这也意味着对后端代码进行大量更改)
在表单上使用 POST
方法,这样字段数据就不会显示在 URL 上(但这意味着您没有用户可以添加书签的链接)。
如果你必须“美化”这个 URL,我的建议是上面的选项 2。
不过,坦率地说,我不会担心。人们对“漂亮”的 URL 感到压力很大。我真的不明白为什么。
据我所知,很少有人真正输入比域名更长的 URL。 如果您为此担心 SEO,请不要担心 - 搜索引擎机器人知道 ULR 编码是什么,并且可以忽略它。 想要一个“漂亮”的 URL 的唯一其他原因是,如果用户通过电子邮件链接或其他方式共享它,它看起来会很好。老实说,如果您为此担心 URL 的美观性并且其中包含表单字段,那么它已经太丑陋了,到处都是&
和 =
标志。编码的括号确实不会让情况变得更糟。
所以我诚实的回答是:不要出汗。这是正常的;忽略它;继续进行 Web 开发工作中更重要的部分。
【讨论】:
感谢您的回答和意见,尽管我对此有一些回答和问题。 1. 我需要使用表单,因为它是用于搜索过滤器的。 2. 我应该用 php 编写脚本还是将%5B%5D
翻译成[]
? 3.需要他们。 4. 必须使用 GET 方法,因为它是一个搜索表单。
@Oskar,你知道你不必使用 GET,GET 和 POST 都去$_REQUEST
...【参考方案3】:
如果这对您来说确实是个问题,那么如何使用某种分隔符(如,
(或任何您想要的))将所有内容“合并”到一个参数中。
因此,您最终会得到像 myvalue=value1,value2
这样的 URI,而不是像 myvalue%5B%5D=value1&myvalue%5B%5D=value2
这样的 URI。
这只是一个想法,现在没有代码,但你需要用 JS 来做,并在你的后端解析 param 值(为了有一个数组)。
【讨论】:
以上是关于提交表单时从 URL 中删除 %5B%5D的主要内容,如果未能解决你的问题,请参考以下文章