【问题标题】:CodeIgniter routing problem. (appends ajax route to existing url)CodeIgniter 路由问题。 (将 ajax 路由附加到现有 url)
【发布时间】:2010-02-01 07:56:06
【问题描述】:

我正在尝试在视图中执行 AJAX 请求,用户提供了一些输入,这些输入使用 AJAX 发送到服务器,并且它应该使用 CodeIgniters 路由来路由它应该去的功能.

这是我提出请求时当前所处的视图。

http://localhost:8888/companies/list

在我的路由配置中,我在下面设置了这条路由来处理 AJAX 请求,它应该能够来自任何视图并且仍然能够转到我指定的路由。

$route['test_ajax'] = "ajax/test_ajax";

所以请求应该转到“ajax”-controller 并使用函数“test_ajax”,这应该使 POST-url 看起来像这样。

POST http://localhost:8888/test_ajax

但我得到的是我当前所在的 URL,而我指定的附加到 URL 的路由完全破坏了我对 AJAX 请求的响应,因为它甚至没有接近它的功能应该的。我得到的 POST-url 看起来像这样。

POST http://localhost:8888/companies/test_ajax

注意 /companies 的参数是如何被删除的。参数 /list 在某处丢失了,尽管如果我在列表后添加一个斜杠,我也会在 URL 中获得列表参数。

所以刚刚发生的事情是 POST 尝试转到公司控制器并查找在 ajax 控制器中而不是在公司控制器中定义的函数 test_ajax。无论我使用什么 URL,此错误都会不断发生,并且始终遵循相同的模式。它不断将我的路由 URL 附加到现有 URL,而不是正确路由。

那么,是什么导致路由以这种方式运行,是否有任何设置被意外启用或什么?因为我知道我已经在以前的项目中使用了数百次。

提前致谢。

【问题讨论】:

    标签: ajax codeigniter routing


    【解决方案1】:

    这是因为您的 Javascript 使用当前目录作为基础,并将 AJAX URL 附加到它。因为您(至少在客户端)在公司目录中,所以它会将您的 URL 附加到此目录中。

    如果您的 Javascript 是内联的,解决方案就是在代码中使用 base_url() PHP 函数...

    var url = '<?= base_url(); ?>test_ajax/'

    如果您的 Javascript 不是内联的,您可以使用 PHP 函数在 HTML 文档的顶部声明一个全局变量...

    var BASE_URL = '<?= base_url(); ?>'

    并在您的 Javascript 中的其他任何地方使用它...

    var url = BASE_URL + 'test_ajax/'

    或者,您可以只硬编码您的基本 URL,但这可能会很快变得非常混乱。

    【讨论】:

    • 要在 CodeIgniter 中使用 'base_url',请确保您已加载 URL 助手。
    • 这行得通,但只是因为我完全忽略了路由,只使用了常规 URL。我想保留我所有的 URL 路由结构。但你肯定有道理。
    • @beseku,如果我把所有的js放在外部js文件中,我该如何使用php代码?
    【解决方案2】:

    事实证明,CodeIgniter 将其解释为相对链接,因为没有标题斜线。 CodeIgniter 用户指南声明不应在路由配置中写入标题或尾部斜杠。

    解决这个问题的方法是在 java-URL 中添加一个斜杠。

    $.ajax({
        url: "/test_ajax",
        type: "POST",
        data: data,
        success: function(data){
            console.log(data);
        }
    });
    

    这会强制 CI 将其解释为绝对 URL,并为我提供我正在寻找的 URL。

    POST http://localhost:8888/test_ajax
    

    【讨论】:

    • 请注意,这意味着如果您将应用程序移出根目录,那么您的 JS 将会中断。这就是 base_url 和 site_url 助手的重点。
    • 它不会中断,因为我已经路由了它,并且它保留在 CI 结构中。如果我将它移动到另一个 URL,我只会得到 othersite.com/test_ajax 该路由仍将在 CI 内路由并找到通往 /test_ajax 的路径。我已经尝试过了,它有效。但这仅仅是因为 CI 使用了您正在谈论的 base_url 设置。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2012-04-27
    相关资源
    最近更新 更多