缓存无法在HTTPS中运行

时间:2012-10-02 10:14:36

标签: .htaccess caching https firebug browser-cache

我之前曾问过这个问题而错误地认为我的问题并不存在(参见: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页面时,资源-a仍然获得304 Not Modified
  4. 当我返回HTTPS页面时,resource-a获得200 OK缓存副本发生了什么变化?如何缓存?
  5. 以下是标题的示例:

    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 个答案:

答案 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)