我尝试在视图中执行AJAX请求,用户提供了一些输入,这些输入通过AJAX发送到服务器,并且它应该去的功能是使用CodeIgniters路由路由的。
这是我在提出请求时所持的观点。
http://localhost:8888/companies/list
在我的路由配置中,我在下面设置了这条路线来处理AJAX请求,该请求应该能够来自任何视图,并且仍然可以转到我指定的路径。
$route['test_ajax'] = "ajax/test_ajax";
所以请求应该转到“ajax”控制器并使用函数“test_ajax”,这应该使POST-url看起来像这样。
POST http://localhost:8888/test_ajax
但我得到的是当前我正站在的URL,我指定的路由附加到URL完全崩溃我的响应来自AJAX请求,因为它甚至没有接近它的功能应该。我得到的POST-url看起来像这样。
POST http://localhost:8888/companies/test_ajax
注意如何删除/ companies的参数。参数/列表在某个地方丢失了,虽然如果我在列表后面添加一个尾部斜杠,我也会在URL中获得list参数。
刚才发生的事情是,POST试图转向公司控制器,并寻找在ajax-controller中定义的函数test_ajax,而不是在公司控制器中定义。无论我在哪个URL,都会出现此错误,并且它始终遵循相同的模式。它会不断将我的route-URL附加到现有URL,而不是正确路由。
那么什么可能导致路由以这种方式运行,是否存在任何意外启用或任何设置的设置?因为我知道我在以前的项目中已经有数百次这样的工作。
提前致谢。
答案 0 :(得分:6)
这是因为您的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/'
或者,您可以只对您的基本网址进行硬编码,但这可能会让您感到非常麻烦。
答案 1 :(得分:1)
事实证明,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