Вопрос или проблема
У меня есть сайт на AngularJS, который извлекает посты из WordPress с помощью плагина “WP REST API (WP API)”. Я тестирую сайт на поддоменах dev и staging, и WP API работает на обоих. Однако, когда я посещаю один домен, а затем сразу переключаюсь на другой домен, динамически сгенерированное значение Access-Control-Allow-Origin “пристраивается” к предыдущему домену для выполнения API вызовов. Только после обновления страницы заголовок ответа обновляется на текущий домен, выполняющий запрос. Вот что говорится в консоли Chrome:
XMLHttpRequest не может загрузить http://wp.domain.tld/wp-json/pages/couples.
Заголовок ‘Access-Control-Allow-Origin’ имеет значение
‘http://staging.domain.tld‘, которое не равно предоставленному источнику.
Поэтому доступ с источника ‘http://dev.domain.tld‘ запрещен.
Как мне это исправить?
Возможно, это больше вопрос по AngularJS. Вы можете попробовать установить ваши заголовки на no-cache
. Например:
var req = {
headers : {
"Pragma" : "no-cache",
"Expires" : -1,
"Cache-Control" : "no-cache"
}
};
Ответ или решение
Ваш вопрос о проблеме с кэшированием заголовка Access-Control-Allow-Origin при использовании WP REST API в AngularJS действительно заслуживает внимания. Давайте рассмотрим решение этой проблемы более подробно.
Проблема, с которой вы столкнулись, связана с кэшированием заголовков CORS (Cross-Origin Resource Sharing). Когда вы переключаетесь между доменами (например, между dev и staging), заголовок Access-Control-Allow-Origin не обновляется сразу, что влечет за собой ошибку доступа.
Что можно сделать для решения проблемы:
-
Настройки сервера:
Убедитесь, что ваш сервер правильно обрабатывает заголовки CORS. В зависимости от вашего веб-сервера (Apache, Nginx и т.д.) убедитесь, что заголовки CORS не кэшируются. Например, для Apache вы можете добавить следующее в ваш .htaccess файл:<IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" Header set Access-Control-Allow-Headers "Content-Type, Authorization" Header set Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate" Header set Pragma "no-cache" Header set Expires "0" </IfModule>
Для Nginx:
add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization'; add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate'; add_header 'Pragma' 'no-cache'; add_header 'Expires' '0';
-
Установка заголовков в AngularJS:
Как вы уже упомянули, вы можете установить заголовки запроса в AngularJS на отсутствие кэширования. Вот пример того, как это сделать:var req = { method: 'GET', url: 'http://wp.domain.tld/wp-json/pages/couples', headers: { "Pragma": "no-cache", "Expires": "-1", "Cache-Control": "no-cache" } }; $http(req).then(function(response) { // Обработка успешного ответа }, function(error) { // Обработка ошибки });
-
Проверка кэша браузера:
Убедитесь, что в настройках вашего браузера отключено кэширование во время разработки. В Chrome это можно сделать через "Инструменты разработчика" -> "Сеть" и отметив опцию "Disable cache" во время открытых инструментов. -
Очистка кэша DNS:
Если проблема продолжает возникать, возможно, ваш DNS кэширует старые настройки. Попробуйте очистить кэш DNS вашего компьютера. В Windows это можно сделать с помощью команды:ipconfig /flushdns
Заключение
При соблюдении этих рекомендаций, включая правильные настройки заголовков на стороне сервера и в AngularJS, вы должны устранить проблему с кэшированием заголовка Access-Control-Allow-Origin между доменами. Обязательно тестируйте изменения на обоих доменах, чтобы подтвердить, что поведение стало стабильным.