提交表单时从 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 的美观性并且其中包含表单字段,那么它已经太丑陋了,到处都是 &amp;= 标志。编码的括号确实不会让情况变得更糟。

所以我诚实的回答是:不要出汗。这是正常的;忽略它;继续进行 Web 开发工作中更重要的部分。

【讨论】:

感谢您的回答和意见,尽管我对此有一些回答和问题。 1. 我需要使用表单,因为它是用于搜索过滤器的。 2. 我应该用 php 编写脚本还是将%5B%5D 翻译成[]? 3.需要他们。 4. 必须使用 GET 方法,因为它是一个搜索表单。 @Oskar,你知道你不必使用 GET,GET 和 POST 都去$_REQUEST...【参考方案3】:

如果这对您来说确实是个问题,那么如何使用某种分隔符(如,(或任何您想要的))将所有内容“合并”到一个参数中。 因此,您最终会得到像 myvalue=value1,value2 这样的 URI,而不是像 myvalue%5B%5D=value1&amp;myvalue%5B%5D=value2 这样的 URI。

这只是一个想法,现在没有代码,但你需要用 JS 来做,并在你的后端解析 param 值(为了有一个数组)。

【讨论】:

以上是关于提交表单时从 URL 中删除 %5B%5D的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 在提交时从HTML表单中删除$

如何在表单提交期间删除 URL 中的特殊字符

提交 GET 表单时,查询字符串会从操作 URL 中删除

在 React 中提交表单时渲染数据

URL传值和form表单提交的区别和原理

jquery异步提交表单,如何跳转URL