【问题标题】:Caching not working in HTTPS缓存在 HTTPS 中不起作用
【发布时间】:2012-10-02 10:14:35
【问题描述】:

我之前曾问过这个问题,并错误地认为我的问题并不真正存在(请参阅:Caching and HTTPS)。我错了;问题确实存在。

这是我的问题的描述:

  1. 当我从 HTTP 页面加载资源(例如,resource-a)(在 HTTP 页面上时,所有资源都来自 HTTP),我得到一个 200 OK。当我重新加载页面(或转到另一个 HTTP 页面)时,resource-a 会得到一个304 Not Modified
  2. 当我从 HTTPS 页面加载资源-a 时(在 HTTPS 页面上时,所有资源都来自 HTTPS),资源-a 从 HTTPS 加载并获得200 OK。当我重新加载页面(或转到另一个 HTTPS 页面)时,我会收到一个304 Not Modified
  3. 当我返回一个 HTTP 页面时,resource-a 仍然得到一个304 Not Modified
  4. 当我返回一个 HTTPS 页面时,resource-a 得到一个200 OK缓存的副本发生了什么?我怎样才能让它缓存?

这是标题的示例:

Request URL: https://styles.mydomain.com/assets/styles/main.css
Request Method: GET
Status Code: 200 OK

Request Headers
Accept: text/css,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Connection: keep-alive
Host: styles.mydomain.com
Referer: https://www.mydomain.com/sign-in/
User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4

Response Header
Accept-Ranges: bytes
Cache-Control: public
Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 11836
Content-Type: text/css
Date: Tue, 02 Oct 2012 09:51:20 GMT
Expires: Fri, 30 Sep 2022 09:51:20 GMT
Keep-Alive: timeout=5, max=99
Last-Modified: Tue, 02 Oct 2012 09:25:30 GMT
Server: Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/0.9.7a mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 PHP/5.3.8
Vary: Accept-Encoding

【问题讨论】:

  • 嗨。您使用的是 Chrome 22。您是否尝试过其他浏览器?

标签: .htaccess caching https firebug browser-cache


【解决方案1】:

这只是一个最佳猜测,但我怀疑发生的情况是,当您通过 HTTP 连接缓存您的资源(或从缓存加载它以进行不安全会话)时,它被标记为“不可信”,因此不符合从缓存加载 HTTPS 连接的条件。

HTTPS 的部分目的是确保资源不仅不会在传输过程中被窃听,而且不会被中间人修改。考虑以下场景:

[HTTP] GET /foo.js (client -> middleman -> server)
Server replies "blue"
Middleman mutates "blue" into "green"
Client caches "green"

此时,从缓存中加载foo.js 会导致将受污染的foo.js 副本加载到您的HTTPS 会话中,从而危及整个页面视图的安全性。由于您的 HTTPS 会话无法验证文件的真实性(因为它没有通过安全连接缓存),因此它会确保安全并选择加载文件的新副本以确保不加载受损资源。

您的情况有点有趣,因为您拥有文件的安全缓存副本,但您从缓存中返回它以获得非安全页面。我的猜测是这会污染文件,因此它可能不会被重新用于安全缓存。你用的是什么浏览器?

编辑:还有一个想法;既然你有 SSL 可用,如果你总是加载资源的 SSL 版本会发生什么?如果我的猜测是正确的,这应该可以防止缓存被污染,并且应该允许资源保持缓存。

【讨论】:

  • 我实际上正在使用自签名 SSL 证书进行开发。浏览器抱怨它,但我告诉它忽略安全“风险”。这真的只是为了我的测试和开发。当我上线时,我当然会购买 SSL 证书。我确实想将我的整个网站置于 SSL 之下,但一直在努力解决这个缓存问题。我一直不得不下载资源,从而使每个页面加载缓慢。我需要做更多的测试来看看到底发生了什么。我如何测试您的理论是否正确(无需通过 SSL 证书)?
  • 如果问题是我使用的是自签名证书,那么当我购买证书时我的问题就会消失。但是,如果这是浏览器缓存的自然行为呢?那就是当它第一次连接到一个HTTPS页面时会下载一个资源?这意味着每当我的用户在访问其他 HTTP 页面后第一次连接到我的网站时,他们必须再次重新下载所有资源。这并不理想。
  • 自签名与 CA 颁发的证书在这里应该无关紧要。但是,您可以从startssl.com 获得免费的CA 签名证书。我只是设置了一个自签名证书,将所有资产设置为从 https 提供服务,然后查看缓存是否有效。
  • 我把所有资源都放在了HTTPS中。浏览我网站的页面时,一切似乎都缓存得很好。如果我离开我的网站,然后再回来,那么我必须再次下载资源。这不是最优的。我真的希望我的整个网站都是 SSL,但强迫用户继续下载资源是不好的。另外,奇怪的是,我的页面似乎完全加载,然后部分界面空白,然后页面闪烁,然后页面完全加载。这种闪烁的事情似乎只有在我使用 HTTPS 作为资源时才会发生。
  • 我认为你应该按照 Chris 的建议去做,如果你的最终目标是所有 SSL,就停止混合 HTTP 和 HTTPS,看看问题是否消失。在两者之间切换时看到缓存问题我不会感到惊讶。
【解决方案2】:

您是否在使用任何.htaccess 文件?如果是,请将以下代码放入您的 .htaccess 文件中进行缓存。

ExpiresActive On
ExpiresByType text/css "access plus 60 days"

希望对你有帮助...

【讨论】:

    【解决方案3】:

    很抱歉,我没有看到 If-Modified-Since-requestheader,如果我是正确的 (wiki),则需要此标头才能让服务器以 304 Not Modified 回答。

    所以问题是您的客户端没有发送正确的请求,也许您的客户端没有使用来自 http 的缓存内容进行 https 请求。那么您是否在 https 模式下刷新,以检查是否在第二个 https 请求中请求它?

    【讨论】:

    • 所以是浏览器?我在响应中所做的任何事情都不能强制浏览器缓存资源?
    • @StackOverflowNewbie 来自您之前的回答我猜您使用的是 firefox;您是否在about:config 中将browser.cache.disk_cache_ssl 设置为false?另请注意:stackoverflow.com/questions/16483/…
    【解决方案4】:

    Chrome 存在错误。太可悲了,没有人关心解决这个问题

    https://helpx.adobe.com/experience-manager/kb/cache-problems-on-chrome-with-SSL-certificate-errors.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 2012-09-01
      • 2015-05-27
      • 1970-01-01
      相关资源
      最近更新 更多