Codeigniter 4中AJAX联系表单提交报404 无法找到对应API路由
导致提交表单404的常见原因和对应解决方案如下:
路径错误(最高发)
你当前AJAX请求的url写的是绝对路径/Home/contact_user,会直接从域名根目录发起请求,如果你的项目部署在域名子目录下(比如项目访问地址是https://你的域名/站点目录/用户名的形式),就会出现路径不匹配的404。
解决方法:将AJAX的请求地址替换为框架生成的动态地址,在视图文件的JS代码中修改url参数为:url: "<?= base_url('Home/contact_user') ?>",如果JS代码是独立的外部文件,先在视图公共部分定义全局基础路径:
<script> window.baseUrl = "<?= base_url(); ?>"; </script>再将AJAX的url改为:
url: window.baseUrl + "Home/contact_user",如果你没有配置伪静态去掉index.php,还需要在路径前加上index.php:
url: window.baseUrl + "index.php/Home/contact_user",路由匹配冲突
你配置的$routes->get('/(:any)', 'Home::user/$1')会匹配所有GET请求,虽然你的提交是POST请求不会被该路由拦截,但如果开启了自动路由或者存在其他同路径的路由配置,会优先匹配到错误路由。
解决方法:将contact_user的POST路由调整到路由配置的最顶部,确保优先匹配,同时关闭不必要的自动路由:// 放在路由最开头 $routes->post('/Home/contact_user', 'Home::contact_user'); $routes->get('/', 'Home::index'); $routes->get('/(:any)', 'Home::user/$1'); // 关闭自动路由(CI4版本适用) $routes->setAutoRoute(false);大小写/权限问题
检查Home控制器的命名空间是否为namespace App\Controllers;,contact_user方法的访问权限必须为public,同时注意路径的大小写,框架对控制器、方法名的大小写是敏感的,要和路由配置里的拼写完全一致。CSRF拦截(偶发)
如果开启了框架的CSRF防护,请求没有携带CSRF令牌会被拦截,部分配置下会跳转到404页。解决方法是在AJAX请求的参数中加入CSRF令牌:var data = { '<?= csrf_token() ?>': '<?= csrf_hash() ?>', 'user_id': $('#user_id').val(), // 其他原有参数保持不变 };
内容的提问来源于stack exchange,提问作者Nxt Invent Solutions

