403 Запрещенный доступ к контроллеру CodeIgniter из запроса ajax

У меня возникли проблемы с отправкой запроса ajax на контроллер кодирования. Он отбрасывает ошибку 404 Forbidden Access. Я нашел для меня какой-то аналогичный вопрос, но я не уверен, что его особенность в структуре CodeIgniter, а также решение в этом потоке не решило мою проблему. ниже мой запрос ajax. Мне интересно, что это, вероятно, связано с .htaccess корневой папки в папке приложения CI, но я не хочу менять свою конфигурацию по умолчанию.

Отправляет ли запрос ajax контроллеру CI правильный способ его реализации? если нет, любое предложение пожалуйста. Благодаря!

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" ); }); 

Удалите <code> и application/controller из вашего ajax_processor например,

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

Если вы скрываете index.php из url с помощью htaccess или routing попробуйте этот 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'; 

Вы можете использовать другое имя, но меняйте его везде в будущих шагах.

Добавить CSRF в свой Javascript

Добавить скрипт в виде; для меня в footer.php отображается код во всех представлениях.

 <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 … токен.

Автоматически обновлять 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.

Отправить CSRF в PHP

Я создал новый контроллер под названием 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)); } } 

Функция отправки автоматически добавляет CSRF и преобразует массив в объект.

Конечный результат

Теперь вы можете использовать Ajax с JQuery очень просто!

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

Результат:

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

Когда запрос получает данные, CSRF автоматически обновляется до следующего запроса Ajax.

И вуаля !