CORS Access-Control-Max-Age игнорируется
Я размещаю WebApp и его API в разных доменах и использую CORS, чтобы иметь возможность работать с одной и той же политикой происхождения. Все идет нормально. Это работает.
Чтобы отправить только предварительный просмотр CORS один раз за сеанс, я установил
Access-Control-Max-Age до 20 дней, но это не работает (проверено в Chrome):
https://db.tt/vfIW3fD2
Что мне нужно изменить?
Ответы
Ответ 1
Если вы используете инструменты Chrome Dev, убедитесь, что у вас есть "Отключить кеш (в то время как DevTools открыт)" не отмечен. У меня возникли проблемы с "Access-Control-Max-Age", которые не удостаивались чести только для того, чтобы понять, что у меня есть эта опция.
Ответ 2
Chrome/Blink накладывает максимальное время перед полетом 10 минут (600 секунд). Здесь определяется местоположение в исходном коде:
https://chromium.googlesource.com/chromium/blink/+/master/Source/core/loader/CrossOriginPreflightResultCache.cpp#40
Любое предполетное время выше 10 минут будет проигнорировано, и вместо этого будет использовано 10 минут.
В разных браузерах могут быть разные максимальные возрастные политики. Safari/WebKit кэшируется до 5 минут, а Firefox - в течение 24 часов. Исходный код Chrome указывает, что максимальное значение существует, чтобы "свести к минимуму риск использования отравленного кеша после переключения в защищенную сеть".
Если код не может разобрать заголовок max-age (или сервер не указывает заголовок максимального возраста), браузер по умолчанию имеет значение 5 секунд.
Ответ 3
Я бы не слишком сильно полагался на кэширование предполетной защиты.
Из спецификации:
Пользовательские агенты могут очищать записи кэша до того, как прошло время, указанное в поле максимального возраста.
Кроме того, помните следующее (из спецификации CORS):
Существует совпадение с кешем, когда в кэше результатов предпросмотра есть запись кэша, для которой выполняется следующее:
Значение поля origin - это совпадение, учитывающее регистр для исходного источника.
Значение поля url - это совпадение с регистром для URL-адреса запроса.
Значение поля учетных данных является истинным, а флаг пропущенных учетных данных не установлен, или он является ложным и установлен флаг пропущенных учетных данных.
Ваш скриншот не дает способа определить, верны ли какие-либо из вышеперечисленных.