我之前曾问过这个问题而错误地认为我的问题并不存在(参见:Caching and HTTPS)。我错了;问题确实存在。
以下是我的问题描述:
200 OK
。当我重新加载页面(或转到另一个HTTP页面)时,resource-a获得304 Not Modified
。200 OK
。当我重新加载页面(或转到另一个HTTPS页面)时,我得到一个304 Not Modified
。304 Not Modified
。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
答案 0 :(得分: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版本会发生什么?如果我的猜测是正确的,这应该可以防止缓存被污染,并且应该允许资源保持缓存。
答案 1 :(得分:0)
您使用的是.htaccess
个文件吗?如果是,请将以下代码放在.htaccess文件中以进行缓存。
ExpiresActive On
ExpiresByType text/css "access plus 60 days"
希望这可以帮助你...
答案 2 :(得分:0)
我很抱歉,但我没有看到If-Modified-Since
- 请求标题,如果我正确(wiki),那么此标题是必需的服务器以304 Not Modified
回答。
所以问题是你的客户端没有发送正确的请求,也许你的客户端不使用http的缓存内容来处理https请求。那么您是否在https模式下刷新,以检查是否在第二个https请求中请求了它?
答案 3 :(得分:0)
Chrome出现错误。如此悲伤的没人照顾到足以解决