Я хотел бы понять это немного лучше. Ментальная модель, с которой я сейчас работаю, работает примерно так:
- JS, размещенный на foo.com, хочет получить доступ к ресурсу, размещенному на bar.com. Это не то, что браузеры любят показывать своим пользователям, если только нельзя показать, что bar.com приветствует этот запрос.
- Таким образом, foo.com JS по существу разбивает запрос на две половины. Сначала мы отправляем запрос без данных надлежащего вида (GET, POST и т. д.) через объект XMLHttpRequest. Сервер bar.com возвращает то, что он обычно отвечает практически на любой запрос, который может включать или не включать заголовок Access-Control-Allow-Origin. (РЕДАКТИРОВАТЬ: это было заблуждение - см. отличный комментарий от апсиллеров ниже)
- Если браузер получает такой заголовок, он сканирует его в поисках источника (в данном случае foo.com). Если он присутствует, он продолжает отправлять фактический запрос, который его просили отправить. Если нет, то отказывается. (РЕДАКТИРОВАТЬ: это тоже было не совсем правильно)
Если эта модель верна, я не понимаю, почему браузер отправляет заголовок Origin с этим предварительным запросом. Разве проверка соответствия не происходит на стороне клиента? Что дает отправка этого заголовка?
Origin
, так как любой источник может успешно отправить запрос GET/POST любому другому источнику, но ответ может быть невидим для JavaScript, если браузер его заблокирует. (Запросам, отличным от GET и POST, не разрешается достигать сервера до тех пор, пока не будет выполнена успешная предварительная проверка OPTIONS, что вы уже понимаете.) - person apsillers   schedule 19.11.2012