我们有这样的云设置:
User Request -> Perlbal (SSL unwrapping) -> Squid (Caching) -> Apache -> HTTP Response
我们在某些网页上支持SSL,而在其他网页上则不支持。 perlbal层以外的所有内容都只处理未加密的HTTP请求,因为perlbal会解包SSL,但它会添加X-Forwarded-Proto
标头,以便应用程序知道是否使用了SSL。
如果请求通过HTTP访问应用程序(Apache),当该特定页面需要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还是其他。
答案 0 :(得分:0)
OMFG。
由于历史原因,我们在.htaccess中有这个:
BrowserMatch "MSIE" brokenvary=1
BrowserMatch "Mozilla/4.[0-9]{2}" brokenvary=1
BrowserMatch "Opera" !brokenvary
SetEnvIf brokenvary 1 force-no-vary
三个猜测一旦IE 6用户访问我们的网站,squid缓存会发生什么。删除了变化的标题。缓存策略已经破裂。
螺丝IE。删除这是一个很好的举措。现在一切都在工作。