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';
如果你使用htaccess
或routing
隐藏了url
的index.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à!