3

我目前在我的虚拟主机中使用此设置:

<Location />
  SetOutputFilter DEFLATE
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
  SetEnvIfNoCase Request_URI \
  \.(?:gif|jpe?g|png)$ no-gzip dont-vary
  Header append Vary User-Agent env=!dont-vary
</Location>
<Directory />
  ExpiresActive On
  ExpiresByType text/html "access plus 5 minutes"
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/x-javascript "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType text/javascript "access plus 1 month"
  ExpiresByType image/gif "access plus 1 month"
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType image/jpg "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/x-icon "access plus 1 month"
  ExpiresDefault "access plus 1 day"

  <FilesMatch "\.(ico|jpeg|pdf|flv|jpg|png|gif|js|css|swf)$">
    Header set Cache-Control "max-age=2592000, public"
    Header unset Last-Modified
    Header unset ETag
    FileETag None
  </FilesMatch>
  <FilesMatch "\.(html|php)$">
    Header set Cache-Control "max-age=900, public, must-revalidate"
  </FilesMatch>
</Directory>

虽然它非常适合加快速度,但有时用户看不到他们自己对内容所做的更改(主要是在使用 FireFox 时):( 任何建议/优化提示?

4

3 回答 3

1

您应该发送一个 must-revalidate 标头并通过发送 Expires 和 Last-Modified 标头从您的编程语言(例如 PHP)中控制缓存,而不是强制浏览器进行缓存。然后,浏览器会在每个请求上向您的站点询问最新版本,但如果没有任何更改,请确保以空白页面回答。

这可能需要一些时间来实现,但它绝对有效。

于 2010-12-16T09:25:26.247 回答
0

这里的问题是浏览器缓存您的 javascript、css 和图像,因此除非缓存过期,否则不会知道您是否修改了服务器中的任何内容。

例如,假设您有一个名为 script.js 的 JS 文件。根据您在 htaccess 文件中的以下规则,

ExpiresByType application/x-javascript "access plus 1 month"  
ExpiresByType application/javascript "access plus 1 month"

javascript 文件被缓存了一个月,因此除非手动清除缓存,否则 1 个月内不会要求新的 JS 文件请求。

如何解决这个问题呢。

假设您的文件名是 script.js,在 HTML 文件中,您应该包括

<script src="includes/script.100.js" type="text/javascript"></script>

或者

<link rel="stylesheet" type="text/css" href="includes/style.100.css" />  

100 可以是任何数字。我通常会从 1、2、3.. 等(准确地说是版本号)增加 if。

现在,在我的 htaccess 中,我有类似的东西

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^includes/style\.[\d]+\.css$ /includes/style.css [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^includes/script\.[\d]+\.js$ /includes/script.js [L]

上述两个条件确保使用实际文件,无论文件名和文件类型之间使用什么数字。

这样可以确保每次进行更改时,一旦更改版本号,所有旧缓存都会过期,并且所有用户都会看到最新代码。

于 2010-12-11T11:35:42.040 回答
0

在 Hannes 回复问题是基于内容而不是在 js/css 文件中之后发布此评论。

我曾经遇到过这个问题,但无法确定到底是什么问题。我认为原因可能是 HTML 页面缓存在我和浏览器之间的代理服务器中的某个位置。

所以,我所做的是使用名为 hash 的查询参数生成 url,它的内容类似于 md5(time("U"));

例如,有同样问题的 url 是这样的

http://test.com/controller/functionname/

在这个问题之后,我进行了更改,以便用户点击的所有网址都类似于

http://test.com/controller/functionname/?hash= {something}。

我希望这对你有用。还要再次确定,您可以在您的网页中添加。

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
于 2010-12-13T14:20:48.763 回答