浏览器可以从其缓存中显示对象而无需接收304状态代码吗?

时间:2011-06-19 23:06:43

标签: browser-cache cache-control http-status-code-304

我试图了解是否可以避免对某些嵌入对象的请求,直接从缓存加载它们而不询问Web服务器(如果对象是否有效)(我不希望Web服务器响应我304 http状态代码)有可能吗? expire 标头是否适用于此方式?怎么样?


当然:要求:

<script scr="my_js.php"></script> 

回应:

<? header("HTTP/1.1 304 Not Modified");
header("Expires: Mon, 31 Dec 2035 12:00:00 gmt");
header("Cache-Control: max-age=".(60*60*24*365)); 
echo "//this is a simpe example"; ?>

解决

浏览器从其缓存中加载资源,而不是仅在第一次打开页面新选项卡或新浏览器窗口)时将其提交给Web服务器

其他时候浏览器始终向服务器询问有关其缓存中保存的资源的信息。然后,Web服务器响应200或301.

2 个答案:

答案 0 :(得分:2)

是的,设置一个远程到期标头,并且该资产将在到期之前再次下载。

  

如果删除Last-Modified和ETag标头,您将完全消除If-Modified-Since和If-None-Match请求及其304 Not Modified Responses,因此文件将保持缓存而不检查更新,直到Expires标题表示新内容可用!

Source

答案 1 :(得分:0)

从我的htaccess ...

<IfModule mod_headers.c>

    Header unset Pragma
    FileETag None
    Header unset ETag

    # cache images/pdf docs for 10 days
    <FilesMatch "\.(ico|pdf|jpg|jpeg|png|gif|js)$">

      Header set Expires "Mon, 31 Dec 2035 12:00:00 gmt"
      Header unset ETag  
      Header unset Last-Modified

    </FilesMatch>

    # cache html/htm/xml/txt diles for 2 days
    <FilesMatch "\.(html|htm|xml|txt|xsl)$">
      Header set Cache-Control "max-age=7200, must-revalidate"
    </FilesMatch>

</IfModule>

它似乎不起作用....例如firebug的网络面板显示我总是200状态代码和access.log文件报告我外部对象总是由浏览器请求。