CORS Access-Control-Allow-Origin несмотря на правильные заголовки - PullRequest
5 голосов
/ 08 марта 2012

Я пытаюсь настроить простой общий доступ к ресурсам из разных источников с использованием jQuery (1.7.1) с поддержкой ajax на клиенте и сервере Apache Python (django).Согласно всем инструкциям, которые я прочитал, мои заголовки установлены правильно, но я продолжаю получать следующую ошибку:

XMLHttpRequest не может загрузить http://myexternaldomain.com/get_data. Источник http://localhost:8080 не разрешенAccess-Control-Allow-Origin.

Заголовок, который я пытаюсь (я не уверен, что он даже проходит через браузер) отправить:

Request URL:http://myexternaldomain.com/get_data
Accept:application/json, text/javascript, */*; q=0.01
Origin:http://localhost:8080
Referer:http://localhost:8080/static/js/test-zetta.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11

Код javascript:

    var request = $.ajax({
        url : "http://myexternaldomain.com/get_data",
        type : "POST",
        dataType : "json",
        crossDomain : true
    });

Обратите внимание, что origin установлен правильно.Сервер добавляет заголовок Access-Control-Allow-Origin = *, используя следующий код Python

def process_response(self, response):
    if response.has_header('Access-Control-Allow-Origin'):
            return response

    response['Access-Control-Allow-Origin'] = '*'
    return response

def get_orders(request):
    """ Tell worker what to do """
    response_data = {}
    response_data['action'] = 'probe'
    response = process_response(HttpResponse(json.dumps(response_data), mimetype="application/json"))
    return response

Если я обращаюсь непосредственно к адресу, появляется подтверждение того, что заголовок установлен правильно

Access-Control-Allow-Origin:*
Content-Type:application/json
Date:Thu, 08 Mar 2012 05:06:25 GMT
Server:Apache/2.2.20 (Ubuntu)
Transfer-Encoding:chunked

Однаков междоменной настройке всегда происходит сбой (пробовал и chrome, и firefox).Я попытался реализовать код точно так же, как в соответствии с выбранным ответом на этот вопрос, но получил ту же ошибку

Обновление

Я довольноуверен, что проблема связана со стороной сервера, так как мне удалось заставить мои вызовы ajax работать с другим общедоступным сервером с поддержкой CORS.Когда я сравниваю заголовки, возвращаемые с этого общедоступного сервера, и те, которые возвращаются с моего (когда я тестирую из того же домена), я не вижу каких-либо существенных различий, которые могли бы объяснить разницу (см. Ниже).тонкость, которую я исключил, что может или может быть важно, состоит в том, что фактический домен является амазонским доменом нескольких поддоменов. реальный адрес - это http://ec2 -23-20-27-108.compute-1.amazonaws.com / get_orders , не стесняйтесь проверять его, чтобы увидеть, что я делаю неправильно.

с публичного сервера

Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:622
Content-Type:text/html
Date:Thu, 08 Mar 2012 15:33:20 GMT
Keep-Alive:timeout=15, max=99
Server:Apache/2.2.14 (Ubuntu)
Vary:Accept-Encoding
X-Powered-By:Perl/5.8.7, PHP/4.4.0

с моего сервера - (не работает междоменный домен)

Access-Control-Allow-Origin:*
Content-Encoding:gzip
Content-Type:text/plain
Date:Thu, 08 Mar 2012 15:32:24 GMT
Server:Apache/2.2.20 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding

Ответы [ 3 ]

5 голосов
/ 09 марта 2012

Так что меня вводило в заблуждение ответ на переход по URL, и фактически проблема заключалась в том, что при выполнении запроса ajax я получал ошибку 403 (только в Firefox, а не в Chrome) из-за защиты csrf.1001 *

5 голосов
/ 08 марта 2012

Вы должны реализовать «предварительно проверенный» запрос и ответ, потому что ваша ситуация считается запросом « не так просто ».Базовый CORS, для которого требуется только заголовок Origin, может иметь только типы контента «application / x-www-form-urlencoded», «multipart / form-data» и «text / plain».Поскольку вы возвращаете «application / json», вы не соответствуете этому требованию.

Я ничего не знаю о Django, но мне было проще внедрить поддержку CORS вне моего приложения с помощью фильтра Tomcat .Похоже, вы можете сделать то же самое с Django.

2013-08-11: Похоже, что репозитория GitHub больше нет с нами.Но пакет Django по-прежнему доступен на https://pypi.python.org/pypi/django-cors/0.1

2 голосов
/ 05 мая 2014

Я использовал отличную библиотеку django-cors-headers и столкнулся с этой проблемой.Для меня решение состояло в том, чтобы добавить 'accept-encoding' к кортежу CORS_ALLOW_HEADERS по умолчанию.

...