我们有这样的云安装:
User Request -> Perlbal (SSL unwrapping) -> Squid (Caching) -> Apache -> HTTP Response
我们在一些页面上支持SSL,而不是在其他页面上。 除了perlbal层之外的所有东西都只能通过未encryption的HTTP处理请求,因为perlbal解开了SSL,但是它会添加一个X-Forwarded-Proto
头,以便应用程序知道是否使用了SSL。
如果请求通过HTTP访问应用程序(Apache),那么当该特定页面需要SSL时,它将redirect到HTTPS。
当一个安全资源的请求到达我们的应用程序,如果应用程序发送Cache-Control: public
,鱿鱼caching内容正确。 问题是,如果用户在caching后试图访问该资源的HTTP版本,则squid会将其作为cachingHIT进行处理,并通过HTTP返回caching的资源,实际上我们需要将其视为cachingMISS,因为X -Forwarded-Proto与原始请求不匹配。
这是怎么做的? 我们的申请发送:
Vary: X-Forwarded-Proto,Accept-Encoding
我很难find任何文章/文件,这个Vary头似乎是别人的build议,但它不工作。 Squid提供高速caching的内容,而不pipeX-Forwarded-Proto头是否指示SSL或其他。
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用户访问我们的网站,鱿鱼caching会发生什么。 更改标题删除。 caching策略被打破。
螺丝IE。 取消这是一个很好的举措。 现在一切正常。