Angularjs — Почему мой запрос на УДАЛЕНИЕ отображается как опции?

#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 .