我们有这样的云设置:
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 或其他。