我在向 codeigniter Controller 发送 ajax 请求时遇到问题。它返回 404 禁止访问错误。我发现了一些与此类似的问题,但我不确定它是否特定于 CodeIgniter 框架,而且该线程中给出的解决方案也没有解决我的问题。下面是我的ajax请求。我想知道这可能是因为 CI 应用程序文件夹的根文件夹的 .htaccess,但我还不想更改其默认配置。
向 CI Controller 发送 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"
);
});
最佳答案
CodeIgniter使用csrf_protection,您可以简单地将它与Ajax和JQuery一起使用。 这个(最终?)解决方案适用于多个 Ajax 请求(没有 403 ;-) 并保持安全性)。
更改配置
打开文件/application/config/config.php 并将 $config['csrf_token_name'] 行更改为:
$config['csrf_token_name'] = 'token';
您可以使用其他名称,但在以后的步骤中随处更改它。
在 JavaScript 中添加 CSRF
在 View 中添加脚本;对我来说是在 footer.php 中在所有 View 中显示代码。
<script type="text/javascript">
var CFG = {
url: '<?php echo $this->config->item('base_url');?>',
token: '<?php echo $this->security->get_csrf_hash();?>'
};
</script>
该脚本创建一个名为CFG的对象。该对象可以在您的 Javascript 代码中使用。 CFG.url 包含您网站的 url 和 CFG.token ... 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 token ,并在每次发送 Ajax 请求时更新它。
用 PHP 发送 CSRF
我创建了一个新 Controller ,名为 Ajax。在CodeIgniter中,使用它的链接是http://www.domain.ltd/ ajax/foo
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Ajax extends CI_Controller {
public function foo() {
$this->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请求。
瞧瞧!
关于php - 403 禁止从 ajax 请求访问 CodeIgniter Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22527412/