Access-Control-Allow-Origin отсутствует в первом ответе

Я работаю над веб-приложением (Angular + Rails), которое передает серверные ресурсы через CloudFront CDN. Приложение обслуживается с помощью nginx, который правильно настроен для установки заголовка "Access-Control-Allow-Origin". CloudFront настроен для пересылки заголовка.

Проблема в том, что заголовок отсутствует в первом ответе для шаблона Angular, но он правильно присутствует в последующих ответах (если я обновляю страницу).

Например, если я очищу всю историю и кеш в Chrome и загляну на страницу, ответ для файла шаблона не будет содержать заголовок "Access-Control-Allow-Origin". Если я обновляю страницу, ответ для шаблона будет иметь заголовок.

Я заметил, что если я очищу всю историю и кеш, но не файлы cookie, он будет работать правильно.

В Firefox он работает аналогично. Если я очищу всю историю и кеш, он не работает с первым ответом, но он корректно работает с последующими ответами. После очистки всей истории и кеша, но без файлов cookie, он продолжает работать правильно, в отличие от Chrome.

Кроме того, если я открываю инструменты для разработки и отключает кеш в Firefox, заголовок отсутствует в каждом ответе.

Знаете ли вы, что может быть проблемой или где я должен выглядеть следующим образом?

Спасибо.

Ответы

Ответ 1

"Access-Control-Allow-Origin" - это заголовок ответа, а не заголовок запроса. Он возвращается HTTP-сервером, когда HTTP-клиент отправляет запрос с помощью метода OPTION. Например, API-интерфейс ajax в браузерах отправляет запрос OPTION перед попыткой запроса POST, когда целевой URL не является текущим URL-адресом страницы (см. Проблему совместного использования ресурсов Cross Origin). Этот запрос OPTION содержит заголовок "Origin", который содержит текущую страницу начала URL (схема + домен). API Ajax отправит запрос POST только в том случае, если ответ содержит заголовок "Access-Control-Allow-Origin" с URL-адресом, соответствующим главной странице.

Вам нужно только беспокоиться о таких заголовках, если вы хотите получить доступ к динамическому контенту с другого сервера, чем тот, который обслуживает текущую страницу. Это не похоже на ваш случай.

Для получения дополнительной информации о CORS см. эту страницу в википедии: https://en.wikipedia.org/wiki/Cross-origin_resource_sharing

Ответ 2

Если есть также тег AngularJS, позвольте предложить вам не загружать html-шаблоны, а компилировать их все в один JS файл (например, html2js плагин grunt)