403禁止从ajax请求访问CodeIgniter控制器

我在向codeigniter控制器发送ajax请求时遇到问题。 它正在抛弃404 Forbidden Access错误。 我发现了一些类似的问题,但我不确定它是否特定于CodeIgniter框架,并且该解决方案在该线程中没有解决我的问题。 下面是我的ajax请求。 我想知道这可能是因为CI Application文件夹的根文件夹的.htaccess,但我不想更改其默认配置。

向CI控制器发送ajax请求是否正确实现此方法? 如果没有,请提出任何建议。 谢谢!

var ajax_load = '{loading gif img html}'; var ajax_processor = 'http://localhost/patientcare-v1/application/controller/ajax_processor/save_physical_info'; $("#save").click(function(){ $("#dialog-form").html(ajax_load); $.post( ajax_processor, $("#physical-info").serialize(), function(responseText){ $("#dialog-form").html(responseText); }, "json" ); }); 

ajax_processor删除application/controller ,比如

 var ajax_processor = 'http://localhost/patientcare-v1/index.php/ajax_porcessor/save_physical_info'; 

如果你使用htaccessrouting隐藏了urlindex.php ,那么试试这个url,

 var ajax_processor = 'http://localhost/patientcare-v1/ajax_porcessor/save_physical_info'; 

CodeIgniter使用csrf_protection ,您可以简单地将它与Ajax和JQuery一起使用。 这个(终极?)解决方案适用于多个Ajax请求(无403 ;-)并保持安全性)。

更改配置

打开文件/application/config/config.php并将行$ config [‘csrf_token_name’]更改为:

 $config['csrf_token_name'] = 'token'; 

您可以使用其他名称,但在以后的步骤中随处更改。

在您的Javascript中添加CSRF

在视图中添加脚本; 对我来说,在footer.php中显示所有视图中的代码。

  

该脚本创建一个名为CFG的对象。 此对象可用于您的Javascript代码。 CFG.url包含您网站的url和CFG.token …令牌。

自动更新CSRF

将此代码添加到您的部分$(document).ready(function($){—})

 $(document).ready(function($){ $.ajaxSetup({data: {token: CFG.token}}); $(document).ajaxSuccess(function(e,x) { var result = $.parseJSON(x.responseText); $('input:hidden[name="token"]').val(result.token); $.ajaxSetup({data: {token: result.token}}); }); }); 

此脚本初始化CSRF令牌,并在每次发出请求Ajax时更新它。

用PHP发送CSRF

我创建了一个名为Ajax的新控制器。 在CodeIgniter中,使用它的链接是http://www.domain.ltd/ ajax / foo

 send(array('foo' => 'bar')); } private function send($array) { if (!is_array($array)) return false; $send = array('token' => $this->security->get_csrf_hash()) + $array; if (!headers_sent()) { header('Cache-Control: no-cache, must-revalidate'); header('Expires: ' . date('r')); header('Content-type: application/json'); } exit(json_encode($send, JSON_FORCE_OBJECT)); } } 

send函数自动添加CSRF并转换对象中的数组。

最后的结果

现在,您可以非常简单地将Ajax与JQuery一起使用!

 $.post(CFG.url + 'ajax/foo/', function(data) { console.log(data) }, 'json'); 

结果:

 {"token":"8f65cf8e54ae8b71f4dc1f996ed4dc59","foo":"bar"} 

当请求获取数据时,CSRF会自动更新为下一个Ajax请求。

Etvoilà!