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 определяет, как сопоставлять будущий запрос чтобы решить, можно ли использовать кешированный ответ, а не запрашивая свежую информацию от исходного сервера. Он используется сервер, чтобы указать, какие заголовки используются при выборе представление ресурса в алгоритме согласования содержимого.