У нас есть облачная установка, подобная этой:
User Request -> Perlbal (SSL unwrapping) -> Squid (Caching) -> Apache -> HTTP Response
Мы поддерживаем SSL на некоторых страницах, а не на других. Все, что находится за пределами уровня perlbal, обрабатывает запросы только через незашифрованный HTTP, поскольку perlbal разворачивает SSL, но добавляет заголовок X-Forwarded-Proto
, чтобы приложение знало, использовался ли SSL.
Если запрос попадает в приложение (Apache) по HTTP, когда для этой конкретной страницы требуется SSL, он перенаправляет на HTTPS.
Когда запрос на защищенный ресурс достигает нашего приложения, и если приложение отправляет Cache-Control: public
, squid правильно кэширует этот контент. Проблема заключается в том, что если пользователь затем пытается получить доступ к HTTP-версии этого ресурса после того, как он кешируется, squid обрабатывает его как HIT кеша и возвращает кешированный ресурс по HTTP, тогда как на самом деле нам нужно считать его MISS кешем, потому что X -Forwarded-Proto не соответствует исходному запросу.
Как это сделать? Наша заявка отправляет:
Vary: X-Forwarded-Proto,Accept-Encoding
Мне трудно найти какие-либо статьи / документацию по этому вопросу, и этот заголовок Vary кажется тем, что предлагают другие люди, но он не работает. Squid обслуживает кэшированное содержимое независимо от заголовка X-Forwarded-Proto, указывающего SSL или иным образом.