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-адреса запроса.

Значение поля учетных данных является истинным, а флаг пропущенных учетных данных не установлен, или он является ложным и установлен флаг пропущенных учетных данных.

Ваш скриншот не дает способа определить, верны ли какие-либо из вышеперечисленных.