Javascript 服务器在ajax调用时返回空响应可能是路由错误

Javascript 服务器在ajax调用时返回空响应可能是路由错误,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我有一个简单的搜索输入,我想使用jqueryonblur在点击输出时通过ajax调用发布数据。ajax调用包含以下代码: $(".ajax").blur(function(){ $.ajax({ type: "POST", url : "adminController.php", data : {

我有一个简单的搜索输入,我想使用jqueryonblur在点击输出时通过ajax调用发布数据。ajax调用包含以下代码:

$(".ajax").blur(function(){



            $.ajax({

                     type: "POST",
                     url : "adminController.php",
                     data : {
                     searchInput: $(this).val()
                     },
                     dataType : "json",
                     context : $("#searchResults"),

                    success: function(data)
                         {
                            $(this).text(data);
                            alert(data);
                         },
                    error: function (xhr,textStatus,err)
                         {
                            console.log("readyState: " + xhr.readyState);
                            console.log("responseText: "+ xhr.responseText);
                            console.log("status: " + xhr.status);
                            console.log("text status: " + textStatus);
                            console.log("error: " + err);
                         }
});
        });
当进行post调用时,我得到一个重定向(找到302)到我的自定义404页面。然而,当我在chrome的控制台中检查时,adminController.php的位置是正确的。如果我手动删除重定向条件,我会得到一个200 ok的服务器响应,但响应为空。在我的adminController.php中,我有以下代码(在构造函数中返回后的代码在这里不是必需的):`

我试图实现的是,不用提交按钮,只需将所有内容发布到blur上,并将结果转储到#searchResults div。 我认为这个问题与我的路由器课程有关。post请求中的重定向看起来不正常,因此我将粘贴路由器和引导文件的代码

bootstrap.php:

    <?php

/**
 * @param $className
 * bootstrap file for autoload function and router calling
 *
 */


function my_autoloader($class) {

    if (file_exists(realpath(__DIR__). DIRECTORY_SEPARATOR . $class . '.php'))
    include realpath(__DIR__). DIRECTORY_SEPARATOR . $class . '.php';
    else if (file_exists(realpath(__DIR__). '\\Classes\\' . $class . '.php'))
    include realpath(__DIR__). '\\Classes\\' . $class . '.php';
    else if (file_exists(realpath(__DIR__). '\\Classes\\Controller\\' . $class. '.php'))
    include realpath(__DIR__). '\\Classes\\Controller\\' . $class. '.php';
    else if (file_exists(realpath(__DIR__). '\\Classes\\Model\\' . $class. '.php'))
    include realpath(__DIR__). '\\Classes\\Model\\' . $class. '.php';
    else if (file_exists(realpath(__DIR__). '\\Classes\\View\\' . $class. '.php'))
    include realpath(__DIR__). '\\Classes\\View\\' . $class. '.php';

    else
    {
       $error = new errorController('classNotFound');
    }
}

spl_autoload_register('my_autoloader');


    $routes = new router();
    $routes->add('/home', 'homeController');
    $routes->add('/login', 'loginController');
    $routes->add('/register', 'registerController');
    $routes->add('/index.php', 'homeController');
    $routes->add('/invoicing','invoiceController');
    $routes->add('/admin','adminController');
    $routes->add('/404','errorController');
    $routes->submit();
/** *将可用路由及其方法(字符串、匿名函数等)添加到数组中 */

最后但并非最不重要的是,我的.htaccess

ReWriteEngine On
ReWriteRule ^public/ - [L,NC]
ReWriteBase /Costing/
RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-d
RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]
编辑1:我正在使用Xampp,我的域是localhost/Costing/。我尝试将url更改为Costing/admin,因此我取消了重定向。但是,除非我删除dataType=“json”,否则我将返回空响应(如果我删除json,我将返回包含脚本的完整html页面,也就是adminView文件)。使用MVC架构


编辑2:我找到了一个解决方法。看来我是对的,路由是问题的根源。因此,我创建了一个ajaxHandler.php文件,并将其放在Costing目录之外,然后编辑了ajax url,如下所示:“http://localhost/ajaxHandler.php”。我从这个文件中得到了一个有效的响应,但是我不能处理根目录之外的文件。所以我需要更改访问权限。欢迎任何想法

我自己找到了解决方案,问题出在htaccess上。基本上是台词

RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-d
不允许我的URL请求文件或目录,因此禁止任何以.php结尾的内容。我必须创建一个文件夹并将ajax处理文件放在其中,然后添加一个异常,如下所示:

ReWriteRule ^ajax/ - [L,NC]

现在htaccess允许调用这个文件,我可以正确地使用它。我不确定这是否安全,但我仍然不知道为什么url/admin不能像marian正确指出的那样工作。如果有人发现除了bootstrap.php之外,它为什么会很棒,我看不到任何实际执行的php代码(即index.php)

对于单个服务器端入口点,正如您正在努力实现的那样,您希望所有请求都在入口点结束,完整路由请求保持不变。从这个入口点,您可以调用路由器,路由器将调用adminController类

然后,操作顺序变为:

  • Ajax请求发送到/admin
  • 请求被定向到index.php
  • php启动引导程序以加载自动加载器
  • php使用传入路径调用路由器
  • 路由器调用实际的AdminController类

  • 空响应很可能是因为服务器只执行adminController.php,它似乎没有回显任何内容(该类从未在该文件中初始化)。

    如果您有路由器,为什么要在
    url:“adminController.php”上发送ajax请求,
    ?为什么不直接在/admin上呢?我试过了,但是我得到了相同的结果(虽然我不需要删除重定向条件),这对于空响应是可以的。如果我删除datatype=“json”,我将返回完整的html页面作为响应。我没有包含index.php,但其中的代码是:require_once'bootstrap.php';您包含的操作顺序与发生的操作顺序完全相同。我将url从adminController.php更改为/admin以正确发送请求(为什么会出现404错误)。输入/admin url时,将在router类上初始化adminController,然后调用adminController->displayPage函数。你是对的,我把返回的json_encode($cars)改为echo json_encode($cars),但还是没有运气。解决方法很好,基于此,我建议在“submit”方法中添加一些调试。您可以尝试$\u SERVER['REQUEST\u URI']而不是$\u GET,检查两者的值。检查您在提交的if/else中的结束位置。另外,可能会添加一个echo“hello world”,在其中调用json_encode
    ReWriteEngine On
    ReWriteRule ^public/ - [L,NC]
    ReWriteBase /Costing/
    RewriteCond %(REQUEST_FILENAME) !-f
    RewriteCond %(REQUEST_FILENAME) !-d
    RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]
    
    RewriteCond %(REQUEST_FILENAME) !-f
    RewriteCond %(REQUEST_FILENAME) !-d
    
    ReWriteRule ^ajax/ - [L,NC]