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

Javascript 为什么要对Jquery Ajax URL进行双重编码,javascript,php,jquery,ajax,urlencode,Javascript,Php,Jquery,Ajax,Urlencode,在我的JS中,我使用jQueryAjax函数 下面是它的样子: $.ajax({ url: "somepage/" + keyword + "/" + xyz + "/" + abc + "/getbla", (...) if ($_GET['anyparam'] == 'getbla') { $searchString = array( 'keyword' => trim($_POST['keyword']), 'xyz' => t

在我的JS中,我使用jQueryAjax函数

下面是它的样子:

$.ajax({
   url: "somepage/" + keyword + "/" + xyz + "/" + abc + "/getbla",
(...)
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']));
  }
如果“关键字”(=文本字段的值)包含“#”,则不再有效。我们都知道,URL将被解析,直到#和#后面的其余部分被用作锚

因此,我将ajax函数修改为:

$.ajax({
   url: "somepage/" + encodeURIComponent(keyword) + "/" + xyz + "/" + abc + "/getbla",
(...)
这也不起作用,但在控制台中,我可以看到完整的url,其中包含%23,而不是#

好的,这接近我想要的,但是请求仍然不起作用-我不知道为什么-这就是为什么我在这里问

我在文本字段(=关键字)中键入了%23,请求工作正常。 我的php后端正在发回我正在寻找的数据

这是我的最终解决方案:

$.ajax({
   url: "somepage/" + encodeURIComponent(encodeURIComponent(keyword)) + "/" + xyz + "/" + abc + "/getbla",
(...)
以下是PHP函数的外观:

$.ajax({
   url: "somepage/" + keyword + "/" + xyz + "/" + abc + "/getbla",
(...)
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']));
  }

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

您未使用encodeURIComponent输入的URL实际上很好,您只是对正确的URL进行了编码,这使其不正确,因此,您必须应用2次才能使其从正确->不正确->正确。

我的猜测是您正在使用url重写,因此初始请求将通过,并且
#
将被解码,并在丢弃散列后重定向所有内容。
对于双重编码,第一个请求将解码到
%23
重定向到
#


如果您使用的是mod_rewrite,请看一看

我想这条规则就是我想要的:

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

为什么不将这些值作为
数据
发送?O.O-
$.ajax({url:…,数据:{“关键字”:…,“xyz”:…,“abc”:…}/*…*/);
您可以分享一些通过
$this->dataBaseFunctions->searchResult()搜索的记录的示例吗
?它们是否以URL编码的形式存储在您的数据库中?@Andreas:我已经这样做了。data属性包含序列化的表单值。@JonathanLonowski:我不能说用户可能会搜索什么。我尝试了类似“test#1”的东西,所以我考虑了这些特殊字符。在这种情况下,我不想限制用户。(at)穆萨:是的,我在这里使用重写规则-很好地观察到,我的任务是通知您有关此附加信息。感谢您的解释。但您的解决方案导致了一个进一步的问题:如果我在适当的重写规则中设置了B标志,但同时想使用#作为锚定,会发生什么?这有效吗?如果您的url有锚定(未编码)你的浏览器不会在请求中发送它或在它之后发送任何东西,所以这无关紧要。好吧,到目前为止,这是有效的。如果用户键入类似“test#1”的内容,我可以看到所有数据。但是我还想调用somepage/test#1/123/。如果我将所有空格替换为“-”,那么就有类似于somepage/test#1/123的内容,这适用于没有#的数据。所以在这种情况下我必须再次处理“#”。我尝试了这个somepage/test-%231/123/但是服务器或应用程序找不到请求集页面(404)。那么为什么服务器不能在这里处理%23呢?只有这里有效:somepage/test-%2520%25231/123是否使用了B标志?