1

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

这是我的问题的描述:

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

4 回答 4

6

这只是一个最好的猜测,但我怀疑正在发生的事情是,当您通过 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 版本会发生什么?如果我的猜测是正确的,这应该可以防止缓存被污染,并且应该允许资源保持缓存。

于 2012-10-05T17:19:16.580 回答
0

很抱歉,但我没有看到If-Modified-Since-requestheader,如果我是正确的(wiki),则需要此标头才能允许服务器使用304 Not Modified.

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

于 2012-10-12T12:55:44.797 回答
0

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

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

希望这可以帮到你...

于 2012-10-11T13:55:36.733 回答
0

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

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

于 2018-09-10T02:47:46.293 回答