针对Pagespeed优化的Apache Vhost指令

时间:2010-12-01 08:29:32

标签: apache caching optimization vhosts pagespeed

我目前在vhost中使用此设置:

<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时):(任何建议/优化提示?

3 个答案:

答案 0 :(得分:1)

您应该发送一个必须重新生成的标头,并通过发送Expires和Last-Modified标头来控制编程语言(例如PHP)中的缓存,而不是强制浏览器缓存。然后,浏览器会向您的网站询问每个请求的最新版本,但如果没有任何更改,请务必使用空白页面进行回答。

这可能需要一些时间来实施,但它确实有效。

答案 1 :(得分: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文件中,您应该包括is

<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 ......等等(版本号是准确的)。

现在,在我的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]

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

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

答案 2 :(得分:0)

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

我有过一次这个问题,但无法确定是什么问题。我认为原因可能是HTML页面缓存在我和浏览器之间的代理服务器中。

所以,我所做的是使用名为hash的查询参数生成的url,其中包含md5(time(“U”));

例如,具有相同问题的网址类似于

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

在此问题之后,我进行了更改,以便用户点击的所有网址都是

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

我希望能帮到你。另外要确保您可以添加您的网页。

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">