缓存在 HTTPS 中不起作用

Sta*_*bie 1 .htaccess https firebug caching browser-cache

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

这是我的问题的描述:

  1. 当我从 HTTP 页面加载资源(比如resource-a)时(在 HTTP 页面上,所有资源都来自 HTTP),我得到一个200 OK. 当我重新加载页面(或转到另一个 HTTP 页面)时,资源-a 会获取一个304 Not Modified.
  2. 当我从 HTTPS 页面加载资源 a 时(在 HTTPS 页面上,所有资源都将来自 HTTPS),资源 a 从 HTTPS 加载并获得200 OK. 当我重新加载页面(或转到另一个 HTTPS 页面)时,我会得到一个304 Not Modified.
  3. 当我返回到一个 HTTP 页面时,资源-a 仍然得到一个304 Not Modified.
  4. 当我返回到一个 HTTPS 页面时,资源-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
Run Code Online (Sandbox Code Playgroud)

Chr*_*ald 6

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

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

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

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

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

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