8

当我提交包含多个具有相同名称的复选框的表单时,我得到一个如下所示的 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>
4

3 回答 3

16

有什么方法可以删除 %5B%5D 以使 URL “漂亮”,例如 htaccess?

不。[]是 URL 中的保留字符,因此它们肯定需要进行URL 编码

如果使用 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>
于 2013-01-04T16:41:06.700 回答
3

[并且]是 URL 中的保留字符,因此浏览器必须对它们进行编码才能使 URL 正常工作。URL 中不能包含这些字符。您也不能有任何其他保留字符,例如空格、& 号等。它们都会自动为您编码(在许多情况下,即使您在浏览器中手动键入 URL)。

如果您需要一个“漂亮的 URL”,您可以:

  1. 根本不使用表格;提供一个指向已知“漂亮”URL 的链接。

  2. 接受丑陋的 URL,但立即将其重定向到上面第 1 点中的漂亮 URL。

  3. 避免在字段名称中使用尖括号(但这也意味着对后端代码进行大量更改)

  4. 在表单上使用一种POST方法,以便字段数据根本不会显示在 URL 上(但这意味着您没有用户可以添加书签的链接)。

如果你必须“美化”这个 URL,我的建议是上面的选项 2。

不过,坦率地说,我不会担心。人们对“漂亮”的 URL 感到压力很大。我真的不明白为什么。

  • 我认识的很少有人真正输入比域名更长的 URL。
  • 如果您为此担心 SEO,请不要 - 搜索引擎机器人知道 ULR 编码是什么,并且可以忽略它。
  • The only other reason for wanting a "pretty" URL is so that it looks good if users share it via an email link or something. To be honest, if you're worried about URL prettyness for that and it's got form fields in it then it's already too ugly, with just the & and = signs all over the place. The encoded brackets really don't make it any worse.

So my honest answer is: don't sweat it. It's normal; ignore it; get on with more important parts of your web development work.

于 2013-01-04T16:53:51.963 回答
0

If that is really a problem for you, how about "merging" everything into a single param using some kind of separator like , (or whatever you want). So, instead of having a URI like myvalue%5B%5D=value1&myvalue%5B%5D=value2, you would end up with a URI like myvalue=value1,value2.

This is just an idea, don't have the code right now, but you will need to do it with JS, and parse the param value on your backend (in order to have an array).

于 2021-04-08T11:54:53.197 回答