Chrome добавляет заголовок Origin к тому же самому запросу
Мы отправляем запрос AJAX на сервер, работающий локально, т.е.
xhr.open("POST", "http://localhost:9000/context/request");
xhr.addHeader(someCustomHeaders);
xhr.send(someData);
Страница, выполняемая этим javascript, также отправляется с localhost: 9000, т.е. это полностью похоже на запрос того же происхождения.
Однако по какой-то причине Google Chrome всегда задает заголовок Origin в результате запроса, заставляя наш сервер блокировать запрос на основании ложного предположения, которое запросит CORS.
Это не происходит в Firefox.
Кроме того, ни Firefox, ни Chrome не отправляют запрос предварительной проверки OPTIONS, что путает; зачем устанавливать заголовок Origin без предварительного предпросмотра, чтобы сервер Origin и пользовательские заголовки разрешались сервером?
Кто-нибудь знает, что происходит в этом случае? Мы не понимаем специфика CORS?
Ответы
Ответ 1
Chrome и Safari включают заголовок Origin
в однопользовательских запросах POST/PUT/DELETE (запросы GET того же происхождения не будут иметь заголовок Origin). Firefox не включает заголовок Origin
для запросов с одним и тем же источником. Браузеры не ожидают заголовки ответов CORS при запросах с одним и тем же источником, поэтому ответ на один и тот же запрос отправляется пользователю независимо от того, имеет ли он заголовки CORS или нет.
Я бы рекомендовал проверить заголовок Host
, и если он соответствует домену в заголовке Origin
, не обрабатывайте запрос как CORS. Заголовки выглядят примерно так:
Host: example.com
Origin: http://example.com
Обратите внимание, что Origin
будет иметь схему (http/https), домен и порт, а Host
будет иметь только домен и порт.
Ответ 2
В соответствии с RFC 6454 - Концепция Web Origin - наличие Origin на самом деле является законным для любого HTTP-запроса, включая запросы с одинаковым исходным кодом:
http://tools.ietf.org/html/rfc6454#section-7.3
"Пользовательский агент МОЖЕТ включать поле заголовка Origin в любом HTTP-сообщении запрос".