#angularjs #yii #cors #options
#angularjs #yii #cors #http-options-метод
Вопрос:
Он работал отлично, но на некоторое время я перестал работать над этим проектом. Я отправляю запрос на удаление на свой сервер, и он дает мне это Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://abc.dev/users/users/18. (Reason: CORS preflight channel did not succeed).(unknown)
API написан на платформе Yii. Я использую CORS
расширение для firefox, мой GET, POST
метод работает отлично, но мой DELETE
метод, похоже, застрял.
Мой контроллер
$scope.delete = function (id)
{
if (confirm("Are you sure you want to delete the user") === true) {
$http({
method: 'DELETE',
url: 'http://abc.dev/users/users/' id,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
.success(function (data) {
$scope.singleuser = data;
console.log("function single user is processed");
$scope.user(); //call the function to reload
})
.error(function (data) {
console.log('error');
});
}
Моя функция удаления серверного API
public function actionDelete() {
switch ($_GET['model']) {
// Load the respective model
case 'users':
$model = User::model()->findByPk($_GET['id']);
break;
default:
$this->_sendResponse(501, sprintf('Error: Mode <b>delete</b> is not implemented for model <b>%s</b>', $_GET['model']));
Yii::app()->end();
}
// Was a model found? If not, raise an error
if ($model === null)
$this->_sendResponse(400, sprintf("Error: Didn't find any model <b>%s</b> with ID <b>%s</b>.", $_GET['model'], $_GET['id']));
// Delete the model
$num = $model->delete();
if ($num > 0)
$this->_sendResponse(200, $num); //this is the only way to work with backbone
else
$this->_sendResponse(500, sprintf("Error: Couldn't delete model <b>%s</b> with ID <b>%s</b>.", $_GET['model'], $_GET['id']));
}
}
Ответ №1:
Вы выполняете запрос с перекрестным источником большинство браузеров отправляют запрос ОПЦИИ перед фактическим запросом на проверку Access-Control-Allow-Origin. Если текущий домен разрешен, то запрос выполняется.
Комментарии:
1. Я много читал и пробовал разные решения, но ничего не получалось. Что мне делать?
2. обработайте ПАРАМЕТР на вашем сервере, чтобы вернуть правильный Access-Control-Allow-Origin
Ответ №2:
Это проблема на стороне сервера. В целях безопасности и экономии нагрузки на сервер веб-серверы по умолчанию не разрешают запросы с перекрестным источником.
Поскольку вы работаете с локального хоста, это не разрешено. Он должен отлично работать с живого веб-сайта. Однако, если вы хотите разрешить перекрестное происхождение, вам придется внести изменения в файл NGINX / Apache .conf на сервере в зависимости от того, что вы используете.
например: для Nginx вам нужно добавить несколько заголовков в запрос
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With';
Комментарии:
1. спасибо за ответ, действительно, это была проблема на стороне сервера.
Ответ №3:
Это была проблема на стороне сервера, этот документ решил мою проблему https://gist.github.com/sourcec0de/4237402
.