NGINX, ssl, CORS и кэширование межсетевого экрана Access-Control-Allow-Origin
Я пытаюсь написать конфигурацию nginx, которая будет обрабатывать два сайта как на http, так и на https, кажется, работает до тех пор, пока клиент никогда не посещает оба сайта, но если они есть, есть проблемы кеширования/межсайтового сайта.
# Allow cross origin
location ~* \.(eot|svg|ttf|woff|woff2|json)$ {
if ($http_origin ~* (https?://(admin\.)?example\.com(:[0-9]+)?)) {
add_header 'Access-Control-Allow-Origin' "$http_origin";
}
}
Итак, если я загружаю example.com, все работает, но тогда, когда я загружаю admin.example.com, я получаю такие проблемы, как это.
(индекс): 1 XMLHttpRequest не может загрузить http://origin.example.com/js/data-lib/currency.json. Заголовок заголовка "Access-Control-Allow-Origin" имеет значение "http://example". com ', который не равен предоставленному происхождению. Origin 'http://admin. пример. com 'поэтому не допускается.
Насколько я могу сказать, это связано с тем, что браузер кэшировал исходный запрос с заголовком, с которым он пришел, и теперь он отрицает меня, даже если другой запрос с сервера позволит это. Доказательство состоит в том, что если я проверяю Отключить кеш в инструментах разработчика Chrome, тогда проблема никогда не произойдет.
Как решить эту проблему? Возможно ли сделать несколько доменов + ssl/http в одной конфигурации или же необходимо разбить их на основе запрашиваемого домена и протокола?
(Извините за ужасные пробелы в моем примере, очевидно, StackOverflow думает, что я пытаюсь публиковать ссылки, когда я просто пишу примеры)
Ответы
Ответ 1
Если вы добавите заголовок ответа Vary
со значением Origin
, это должно привести к тому, что любой браузер пропустит свой кеш и сделает новый сетевой запрос, когда значение заголовка запроса Origin
отличается из значения Origin
запроса, к которому он кэширован.
По крайней мере, это должно иметь такой эффект в браузерах, которые соответствуют соответствующей части спецификации HTTP.
Итак, вы можете обновить конфигурацию nginx, чтобы сделать это:
# Allow cross origin
location ~* \.(eot|svg|ttf|woff|woff2|json)$ {
if ($http_origin ~* (https?://(admin\.)?example\.com(:[0-9]+)?)) {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Vary' "Origin";
}
}
Вы можете прочитать больше в статье MDN в заголовке ответа Vary
.
Заголовок ответа Vary
HTTP определяет, как сопоставлять будущий запрос чтобы решить, можно ли использовать кешированный ответ, а не запрашивая свежую информацию от исходного сервера. Он используется сервер, чтобы указать, какие заголовки используются при выборе представление ресурса в алгоритме согласования содержимого.