为什么要对Jquery Ajax URL进行双重编码

时间:2015-11-07 18:08:04

标签: javascript php jquery ajax urlencode

在我的JS中,我使用jQuery ajax函数。

这是它的样子:

$.ajax({
   url: "somepage/" + keyword + "/" + xyz + "/" + abc + "/getbla",
(...)

如果'keyword'(= textfield的值)包含'#',则此功能不再起作用。我们都知道,URL只会被解析,直到#和#后面的其余部分将用于锚点。

所以我将ajax函数修改为:

$.ajax({
   url: "somepage/" + encodeURIComponent(keyword) + "/" + xyz + "/" + abc + "/getbla",
(...)

这也不起作用,但在控制台中我可以看到带有%23而不是#的完整网址。

好的,这与我想要的很接近,但请求仍然无效 - 我不知道为什么 - 这就是我在这里问的原因。

我在textfield(= keyword)中输入了%23,请求完全正常。 我的php后端正在发送我正在寻找的数据。

所以这是我的最终解决方案:

$.ajax({
   url: "somepage/" + encodeURIComponent(encodeURIComponent(keyword)) + "/" + xyz + "/" + abc + "/getbla",
(...)

这就是PHP函数的样子:

if ($_GET['anyparam'] == 'getbla') {

    $searchString = array(
        'keyword' => trim($_POST['keyword']),
        'xyz' => trim($_POST['xyz']),
        'abc' => trim($_POST['abc'])
    );

    echo json_encode($this->dataBaseFunctions->searchResult($searchString['keyword'], $searchString['xyz'], $searchString['abc']));
  }

问题:为什么我必须对网址进行双重编码?

3 个答案:

答案 0 :(得分:2)

我的猜测是你的使用url重写,所以初始请求通过并且#被解码,并且在散列哈希之后重定向所有内容。
对于双重编码,第一个请求将解码为%23重定向到#

如果您正在使用mod_rewrite,请查看https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_b

答案 1 :(得分:0)

我认为这条规则正是我所寻求的:

RewriteRule ^somepage/([^/]+)/([0-9]+)/?$ somepage&param1=${unesc:$1}&param2=$2 [L]

答案 2 :(得分:-1)

as per this你输入的网址没有使用encodeURIComponent实际上很好,你只是编码正确的网址,这使得它不正确,所以你必须应用2次才能使它从正确 - >>正确─>正确