Задать вопрос

Почему не работает cross-domain HTTP OPTIONS запросы?

Здравствуйте! Я пытаюсь сделать кросс-доменные запросы, и при попытке отправить DELETE запрос - отправляется OPTIONS-запрос, но почему-то в ответ на него всегда получаю 403. И в консоли сообщение об ошибке:

XMLHttpRequest cannot load 5to5admin:8888/images/1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'localhost:8000' is therefore not allowed access.


GET-запросы проходят на ура. Если делать POST-запросы через jQuery - они работают, а вот через $resource - та же самая ошибка, что и выше.

Клиентская часть: ангуляр. Серверная (OpenServer): апач + php.

Последние четыре строчки в htaccess я использовал для перенаправления всех запросов на index.php до того, как понадобились кросс-доменные.

.htaccess
# with AJAX withCredentials=false (cookies NOT sent)
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, PATCH, DELETE"
Header always set Access-Control-Allow-Headers "X-Accept-Charset,X-Accept,Content-Type,Accept-Language,Accept-Charset,X-Request-With,Content-Length,Accept,Origin"

RewriteEngine On

RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
#RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]

RewriteBase /
RewriteCond  %{REQUEST_FILENAME} !-f
RewriteCond  %{REQUEST_FILENAME} !-d
RewriteRule  ^(.*)$ index.php?customUrl=$1 [QSA,L]



Вот так выглядит ресурс в ангуляре:
'use strict';

(function () {

    function imageFun ($resource)
    {
        return $resource('http://5to5admin:8888/images/:id.json', { id: '@id' }, {
            'query': {
                url: 'http://5to5admin:8888/images/?from=:start&limit=:limit',
                method:'GET',
                params: {
                    start: '@start',
                    limit: '@limit'
                },
                isArray: true
            },
            'delete': {
                url: 'http://5to5admin:8888/images/:id',
                method:'DELETE',
                params: {
                    id: '@id'
                }
            }
        });
    }

    angular.module('ftfAdminPanel.images')
        .factory('Image', [ '$resource', imageFun ]);

})();


Вот так выглядит OPTIONS запрос:

8609ce1caf23495da01e9a1c2b60dea2.png


Заранее благодарен.
  • Вопрос задан
  • 6057 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
iNikNik
@iNikNik Автор вопроса
Прошла неделя. Я не сдался :)

После различных экспериментов - мне стало понятно, что проблема где-то в конфигурации апача. Так как OPTIONS-запросы не доходят до моего htaccess. Но, поскольку, я ни разу в жизни не работал с этим конфигом - я не знал что искать и что исправлять.

Но однажды я наткнулся на пост на stackoverflow с заголовком - "Как настроить апач, чтобы он блокировал OPTIONS-запросы". Эврика! Это было то, что нужно! И я без труда нашел в своем конфиге OpenServera следующие строки:
<Directory "%ssitedir%/*">
    AllowOverride All
    Options -MultiViews +Indexes +FollowSymLinks +IncludesNoExec +Includes +ExecCGI
    <LimitExcept GET POST HEAD >
        Require all denied
    </LimitExcept>
</Directory>

И добавил OPTIONS запрос:
<Directory "%ssitedir%/*">
    AllowOverride All
    Options -MultiViews +Indexes +FollowSymLinks +IncludesNoExec +Includes +ExecCGI
    <LimitExcept GET POST HEAD OPTIONS DELETE>
        Require all denied
    </LimitExcept>
</Directory>


Все заработало! Ура, товарищи!!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы