Подтвердить что ты не робот

Заголовок Access-Control-Allow-Origin не работает - Что я делаю неправильно?

Я пытаюсь предоставить ответ на метод HTTP OPTIONS с заголовком Access-Control-Allow-Origin, копирующим содержимое заголовка Origin в запросе.

Это, по-видимому, не работает, по причинам, которые я не могу понять.

TL;DR: ответ OPTIONS говорит:

Access-Control-Allow-Origin: http://10.0.0.105:9294

последующий GET имеет:

Origin:http://10.0.0.105:9294

Chrome говорит:

Origin http://10.0.0.105:9294 is not allowed by Access-Control-Allow-Origin

WTF не?

Подробнее...

При просмотре в окне инструментов разработчика Chrome заголовки запроса:

OPTIONS /user/kris HTTP/1.1
Host: 10.0.0.104:8080
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://10.0.0.105:9294
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.75 Safari/537.1
Access-Control-Request-Headers: origin, x-requested-with, content-type, accept
Accept: */*
Referer: http://10.0.0.105:9294/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Заголовки ответов:

HTTP/1.0 200 OK
Date: Mon, 13 Aug 2012 11:23:45 GMT
Server: WSGIServer/0.1 Python/2.7.3
Content-Length: 0
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD, OPTIONS
Access-Control-Max-Age: 10
Access-Control-Allow-Origin: http://10.0.0.105:9294
Access-Control-Allow-Headers: X-Requested-With, Authorization, X-Huzu-User, Content-Type, Accept
Content-Type: text/html; charset=UTF-8

После того, как jQuery отправит свой запрос OPTIONS и получит вышеупомянутый ответ, произойдет 2 необычных события. Ответ OPTIONS (который равен 200) отображается в консоли разработчика как ошибка:

OPTIONS http://10.0.0.104:8080/user/kris 200 (OK)

После чего отклоняется запрос GET. Ошибка в консоли:

XMLHttpRequest cannot load http://10.0.0.104:8080/user/kris. Origin http://10.0.0.105:9294 is not allowed by Access-Control-Allow-Origin.

Я не понимаю, почему нет. Что я делаю неправильно?

4b9b3361

Ответ 1

Хорошо, я думаю, что у меня это получилось. Кажется, что требуется правильная обработка запроса перед полетом OPTIONS, но НЕ ДОСТАТОЧНО для работы запросов на межсайтовый ресурс.

После того, как запрос OPTIONS возвращается с удовлетворительными заголовками, все ответы на любые последующие запросы на один и тот же URL также должны иметь необходимый заголовок "Access-Control-Allow-Origin", иначе браузер проглотит их, и они выиграли 't даже отображается в окне отладчика.

Итак, это будет выглядеть так, как браузер отменил запрос из-за некоторой проблемы в ответе OPTIONS, но на самом деле браузер просматривает заголовки ответов из реального запроса и затем отклоняет их.