0

我们有这样的云设置:

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 或其他。

4

1 回答 1

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。删除这是一个很好的举措。现在一切正常。

于 2010-11-05T04:14:45.727 回答