2011-03-07 120 views
0

对不起,这似乎与其他一些问题非常相似,但我已经查看了所有可以看到的相关帖子,但它们似乎没有像我做;-)无法让浏览器缓存内容

问题是,我无法获得客户端缓存的.js,.css和图像从我的Apache2服务器上工作(我有两个Ubuntu Apache/2.2.8和一个WAMP Apache在Windows下)。如果通过将Header Unset命令放入我的虚拟主机配置文件中,然后补充Caching指令(请参见下文)来关闭此功能,则可以使用默认设置,即可获得良好的ETag风格的服务器主导缓存(304响应)它似乎并没有被浏览器所尊重。

我可以看到使用Firebug浏览器知道一个缓存文件有效了几个小时,但它仍然要求它。

任何有关如何调试的提示都会受到欢迎。

主机配置的相关部分如下所示:

<VirtualHost *:80> 
    DocumentRoot "C:/Projects/A2C/branches/CR7" 
    ServerName * 
    ServerAlias localhost ecomsvr0.dmclub.net 
    ErrorLog "c:\log\a2c.log" 
    CustomLog "c:\log\a2c-access.log" common 
    <Directory "c:\projects\A2C\branches\CR7"> 
     Options Indexes FollowSymLinks MultiViews 
     AllowOverride all 
     Order allow,deny 
     Allow from all 
    ExpiresDefault A36000 
    Header Set Cache-Control "max-age=7200" 
    Header Unset Etag 
    Header Unset Last-Modified 
    </Directory> 
</VirtualHost> 

回答

1

什么打动我的是,你不发送任何验证(最后-Modified或ETag)。虽然它们不是强制性的,但我强烈建议您发送一个,以使浏览器能够执行条件请求。 RFC 2616表示“只要可行,HTTP/1.1服务器应该发送Last-Modified”。这不一定是你问题的根源,但它可能是。

因此,我建议删除行“标题未设置最后修改”并再次检查。

请注意,您的过期时间为访问时间加上36000s,而您的最大年龄时间为7200s,这是没有意义的。理解新的缓存控制指令的浏览器(所有新浏览器都会这样做)将用于最大化年龄。

如果添加Last-Modified不起作用,您可以发布您的服务器发送的完整响应标题吗?例如,请转至http://redbot.org/并针对您的服务器运行此检查器并发布结果。这将进一步帮助识别您的问题。

+0

我故意删除Last-Modified/ETag,因为我不想要条件请求 - 它们比拥有(比如说)1小时缓存更昂贵。理想情况下,我们都有,但我明白他们不能很好地协作(我想这是由于他们的独立性)。不过,我会尝试redbot的东西。干杯。 – user648498 2011-03-08 09:16:10

+0

刚刚尝试过redbot,发现Firebug向我展示了完全相同的响应。该URL是http://ecom0.edge5.dmclub.net/test/integration/ajl/cachetest.html,我的愿望是获得简单的客户端缓存没有条件请求(我们试图减少延迟) – user648498 2011-03-08 09:23:38

+0

谢谢发布该网址。现在我的FF缓存响应并从缓存中提供,而不需要重新验证。标题包括两个验证器现在(我假设你已经改变了配置)。有条件的请求:当资源不再新鲜时,它们仅由浏览器发送,但仍在缓存中。所以你不应该通过增加一个验证器来放弃任何东西。如果您的后端无法使用HTTP/304(未修改)响应条件请求,则只需返回一个正常的200响应。 – alienhard 2011-03-08 13:44:57