缓存无法在HTTPS中运行

问题描述 投票:1回答:4

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

这是我的问题的描述:

  1. 当我从HTTP页面加载资源(比如资源-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页面时,资源-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
.htaccess caching https firebug browser-cache
4个回答
4
投票

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


0
投票

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

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

希望这可以帮到你...


0
投票

我很抱歉,但我没有看到If-Modified-Since-requestheader,如果我是正确的(wiki)那么,这个标题是必需的,以允许服务器用304 Not Modified回答。

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


0
投票

Chrome有一个错误。如此伤心,没有人足够的关心来解决这个问题

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

© www.soinside.com 2019 - 2024. All rights reserved.