Междоменная предварительная проверка AJAX не прошла проверку источника - PullRequest
9 голосов
/ 15 сентября 2011

Это не похоже на работу:

$.ajax({
    url:      "http://localhost:3000/foo.json",
    data:     { foo: 'bar' },
    headers:  { 'HTTP_X_CUSTOMHEADER': 'foobar' },
    xhrFields: { withCredentials: true }
});

Когда я запускаю его на jsfiddle, запускается запрос OPTIONS (в соответствии с инструментами отладки Chrome), который выглядит следующим образом:

Access-Control-Request-Headers: Origin, HTTP_X_CUSTOMHEADER, Accept
Access-Control-Request-Method:  GET
Origin:                         http://fiddle.jshell.net

И затем (в соответствии с инструментами отладки Chrome) мой локальный сервер возвращает следующие заголовки:

(переформатировано вручную для удобства чтения)

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers:     HTTP_X_CUSTOMHEADER
Access-Control-Allow-Methods:     GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin:      http://fiddle.jshell.net
Access-Control-Max-Age:           10

Cache-Control:                    no-cache
Connection:                       Keep-Alive
Content-Length:                   1
Content-Type:                     text/html; charset=utf-8
Date:                             Wed, 14 Sep 2011 22:42:28 GMT
Server:                           WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10)
X-Runtime:                        2

А затем в консоли я получаю сообщение об ошибке, подобное этому:

XMLHttpRequest cannot load http://localhost:3000/foo.json?foo=bar.
Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin.

Но заголовок Access-Control-Allow-Origin выглядит так же, как когда мой сервер ответил на запрос предполетной проверки.Так что же мне здесь не хватает в этой головоломке?

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Оооооо, хорошо, я понял это, наконец ...

Судя по всему, заголовки ответа перед полетом OPTIONS - не единственное место, где они нужны. Вы должны включить эти заголовки в ответ и для самого контента. У меня были только эти заголовки на предпечатной проверке, и я подумал, что это был единственный «билет», необходимый.

Итак, я добавил те же заголовки в запрос GET для фактического актива, и теперь все отлично работает. Я предполагаю, что пропустил это в документах.

1 голос
/ 15 сентября 2011

Вам необходимо включить Origin в раздел Access-Control-Allow-Headers, поскольку Origin не считается простым заголовком (IMO, спецификация должна включать Origin в список простых заголовков).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...