Заголовки CORS ответа браузера и AJAX отличаются - PullRequest
3 голосов
/ 10 января 2012

Я пытаюсь настроить API с поддержкой CORS, к которому я могу получить доступ через JavaScript.

Код, который я использую для проверки:

$(function(){
get = function(url_fragment)
{
    $.ajax({
        url:        'my_api',
        dataType:   'json',
        cache:      false,
        success:    function(data)
        {
            alert('success');
        },
        error:      function(data)
        {
            alert('failure');
        }
    })
}
get('');
});

Это довольно простой запрос AJAX.

Я включил CORS в моей конфигурации nginx

add_header Access-Control-Allow-Origin *;

И при посещении API в моем браузере firebug показывает ожидаемые заголовки

Access-Control-Allow-Origin *
Connection          keep-alive
Content-Length      59
Content-Type        application/json;charset=utf-8
Server              nginx/1.0.11 + Phusion Passenger 3.0.11 (mod_rails/mod_rack)
Status              200
X-Frame-Options     sameorigin
X-Powered-By        Phusion Passenger (mod_rails/mod_rack) 3.0.11
X-XSS-Protection    1; mode=block

Когда я просматриваю запрос XHR в firebug, заголовок CORS отсутствует:

Connection          keep-alive
Content-Encoding    gzip
Content-Type        text/plain
Server              nginx/1.0.11 + Phusion Passenger 3.0.11 (mod_rails/mod_rack)
Status              403
Transfer-Encoding   chunked
X-Frame-Options     sameorigin
X-Powered-By        Phusion Passenger (mod_rails/mod_rack) 3.0.11

Я получаю правильные заголовки при использовании curl

$ curl -i my_api
HTTP/1.1            200 OK
Content-Type:       application/json;charset=utf-8
Connection:         keep-alive
Status:             200
X-Powered-By:       Phusion Passenger (mod_rails/mod_rack) 3.0.11
X-Frame-Options:    sameorigin
X-XSS-Protection:   1; mode=block
Content-Length:     61
Server:             nginx/1.0.11 + Phusion Passenger 3.0.11 (mod_rails/mod_rack)
Access-Control-Allow-Origin:    *

Излишне говорить, что я не понимаю, почему это не работает, есть идеи?

1 Ответ

4 голосов
/ 10 января 2012

add_header работает только с новыми кодами состояния (200, 204, 301, 302 или 304).Ответ с отсутствующим заголовком - 403, поэтому add_header не будет работать.Модуль сторонних разработчиков более гибок и может добавлять заголовки для любого кода состояния.

...