WOW !! 9 месяцев & Нет ответа Отправлено -: | $ - $ @ _ @
Хорошо, это CodeIgniter (& Я люблю CodeIgniter), я не могу отпустить ..
Wiki Начало: D
Если ваш адрес, работающий в браузере (, вы делаете запрос GET) & не работает с POST/AjaxPOST запрос и получение 500/403 Response/Статус, это означает: ВАМ необходимо отправить CSRF ЗНАК ВМЕСТЕ С POST/AjaxPOST
Если вы используете CodeIgniter CSRF защиты$config['csrf_protection'] = TRUE;
внутри CodeIgniter/application/config.php
ВЫ ДОЛЖНЫ БЫТЬ SEND CSRF ЗНАК ВМЕСТЕ С POST/AjaxPOST
Вы можете использовать CSRF токен внутри HTML формы:
<form action="#" method="post" id="form" role="form">
<input type="hidden" name="<?=$this->security->get_csrf_token_name()?>" value="<?=$this->security->get_csrf_hash()?>">
<!-- Your Other Stuff Waiting Here.... -->
</form>
или, используя CodeIgniter встроенный Form Helper (По умолчанию метод будет POST)
<?=form_open('controller/action', 'id="ci_form_csrf" class="form-controller"'); ?>
<!-- Your Other Stuff Waiting Here.... -->
<?=form_close();?>
Если Не используя CodeIgniter CSRF защиты$config['csrf_protection'] = FALSE;
внутри CodeIgniter/application/config.php
и ..
Проверьте метод контроллера, если у вас есть любое условие проверки запроса или код для GET LY ..
public function my_method() {
if($this->input->get()){
}
}
Url не работает с запросом GET
Url не работает с запросом POST
Url работает с запросом AjaxPOST/AjaxGET
Проверьте метод контроллера, если у вас есть какие-либо запрос проверить состояние или иметь код для AJAX только ..
public function my_method() {
if ($this->input->is_ajax_request()) {
}
}
Url не работает с запросом GET
Url не работает с запросом POST
Url не работает с запросом AjaxPOST/AjaxGET ..и ваша операционная система или Сервера LINUX/UNIX
Убедитесь, что Конвенция правильного именования для CodeIgniter контроллер файла & Модели : See CodeIgniter Change log:
имена файлов класса должны теперь быть Ucfirst и все остальное в нижнем регистре
CodeIgniter Класс Стандарт Нейминг:Ucfirst_controller, Ucfirst_model ...
Это означает, что каждый файл класса должен быть приклеить CodeIgniter Standard Naming Convention
имя файла контроллера User.php или User_controller.php
class User extends CI_Controller {}
Правильный URL доступ:http://www.website.com/controller/method/param
Название модели файла User_model.php
class User_model extends CI_Model {}
Правильный способ загрузки модели в контроллере:$ this-> load-> модель ('User_model')
Подождите ...как насчет AjaxPOST: |
Существует 2 Общий подход, чтобы отправить CSRF маркер вместе с AjaxPOST
1 - Использование PHP кода внутри встроенного JavaScript, $ this-> безопасности-> get_csrf_token_name() & $ this-> безопасности-> get_csrf_token_hash()
2 - Определите глобальный var/object JavaScript для хранения имени CSRF & значение & позже передайте вызов глобальной переменной JavaScript.
3 - Добавить метатег CSRF на верхнем корпусе html и присвоить ему имя и значение.
<meta id="CsrfSecrets" name="<?=$this->security->get_csrf_token_name()?>" content="<?=$this->security->get_csrf_hash()?>"/>
4 - Установите CSRF маркер в пределах AjaxSetup,
// attach CSRF object for each AjaxPOST automatically
$.ajaxSetup({
data: CsrfSecret
});
OMG !! :/Это так запутано для меня .. у вас есть какой-либо пример для меня plzzzzzz .. :(
Ммм .. не беспокойтесь, я даю вам пример, чтобы сделать вас счастливой :)
Пример Первый - (CodeIgniter CSRF Demo | AjaxPOST)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<!-- Using meta tag to retrive CodeIgniter CSRF token -->
<meta name="<?=$this->security->get_csrf_token_name()?>" content="<?=$this->security->get_csrf_hash()?>"/>
<title>CodeIgniter CSRF Demo | AjaxPOST</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript">
// Set CodeIgniter base_url in JavaScript var to use within
var _BASE_URL_ = "<?=base_url()?>";
var _CSRF_NAME_ = "<?=$this->security->get_csrf_token_name()?>";
(function($) {
// getting meta object from body head section by csrf name
var CsrfMetaObj = $('meta[name="' + _CSRF_NAME_ + '"]'),
CsrfSecret = {};
// get meta tag name & value
CsrfSecret[CsrfMetaObj.attr('name')] = CsrfMetaObj.attr('content');
// attach CSRF object for each AjaxPOST automatically
$.ajaxSetup({
data: CsrfSecret
});
})(jQuery);
</script>
</head>
<body>
<button class="button">Click Me to Trigger AjaxPOST</button>
<script type="text/javascript">
// on DOM ready
$(document).ready(function(){
// my button
$btn = $('.button');
// on button click
$btn.on('click', function(e){
// stop default event
e.preventDefault();
// calling AjaxPOST
$.ajax({
url: _BASE_URL_ + 'Controller/Method',
method: 'POST',
// or manually add csrf object
// data: $.extend({id:23, name:'scott'}, CsrfSecret);
success: function(data){
alert('Success');
},
error: function(xhr, status, error){
alert(error);
}
});
});
});
</script>
</body>
</html>
Пример второй - (CodeIgniter CSRF Refresh Demo | AjaxPOST)$config['csrf_regenerate'] = TRUE;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta id="CsrfSecrets" name="<?=$this->security->get_csrf_token_name()?>" content="<?=$this->security->get_csrf_hash()?>"/>
<title>CodeIgniter Refresh CSRF Demo | AjaxPOST</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript">
// Set CodeIgniter base_url in JavaScript var to use within
var _BASE_URL_ = "<?=base_url()?>";
var _CSRF_NAME_ = "<?=$this->security->get_csrf_token_name()?>";
(function($) {
/**
* New jQuery function to set/refresh CSRF token in Body & to attach AjaxPOST
* @param {[type]} $ [description]
* @return {[type]} [description]
*/
$.fn.CsrfAjaxSet = function(CsrfObject) {
// getting meta object from body head section by csrf name
var CsrfMetaObj = $('meta[name="' + _CSRF_NAME_ + '"]'),
CsrfSecret = {};
// if CsrfObject not set/pass in function
if (typeof CsrfObject == 'undefined') {
// assign meta object in CsrfObject
CsrfObject = CsrfMetaObj;
// get meta tag name & value
CsrfSecret[CsrfObject.attr('name')] = CsrfObject.attr('content');
}
// CsrfObject pass in function
else {
// get Csrf Token Name from JSON
var CsrfName = Object.keys(CsrfObject);
// set csrf token name & hash value in object
CsrfSecret[CsrfName[0]] = CsrfObject[CsrfName[0]];
}
// attach CSRF object for each AjaxPOST automatically
$.ajaxSetup({
data: CsrfSecret
});
};
/**
* New jQuery function to get/refresh CSRF token from CodeIgniter
* @param {[type]} $ [description]
* @return {[type]} [description]
*/
$.fn.CsrfAjaxGet = function() {
return $.get(_BASE_URL_ + 'Csrfdata', function(CsrfJSON) {
$(document).CsrfAjaxSet(CsrfJSON);
}, 'JSON');
};
})(jQuery);
// On DOM ready attach CSRF within AjaxPOST
$(document).CsrfAjaxSet();
</script>
</head>
<body>
<button class="button">Click Me to Trigger AjaxPOST</button>
<script type="text/javascript">
// on DOM ready
$(document).ready(function(){
// my button
$btn = $('.button');
// on button click
$btn.on('click', function(e){
// stop default event
e.preventDefault();
// trigger refresh csrf token
var CSRF = $(document).CsrfAjaxGet();
// use callback to put your AjaxPOST & Done!
CSRF.success(function(){
$.ajax({
url: _BASE_URL_ + 'Controller/Method',
method: 'POST',
success: function(data){
alert('Success');
},
error: function(xhr, status, error){
alert(error);
}
});
});
});
});
</script>
</body>
</html>
Какие ошибки (ы) вы получаете? – TrueStory
На самом деле это не выводит никакого значения моему контроллеру, если я попытался распечатать $ _POST в контроллере, он будет пустым. –
Но вы получаете сообщение об ошибке в своем контроллере, выполненная часть успеха или часть ошибки из вашего сценария ajax? – TrueStory