【问题标题】:Apache Vhost Directives Optimized for Pagespeed针对 Pagespeed 优化的 Apache Vhost 指令
【发布时间】:2011-05-18 08:56:09
【问题描述】:

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

<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 时):( 有什么建议/优化提示吗?

【问题讨论】:

    标签: apache caching optimization vhosts pagespeed


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这里的问题是浏览器缓存了您的 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 文件中,你应该包含 as

      <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]
      

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

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

      【讨论】:

      • 对不起,但这不是问题,所有图像在以新格式创建/更改/创建时都包含时间戳,由于版本中存在压缩和重命名,CSS 和 JS 文件也包含在内过程,我面临的问题就是我所描述的,用户在进行更改后更改内容(存储在数据库中的内容显示在通过 php 生成的 html 页面中)/从后端重定向到前端的页面除非他对页面进行硬刷新,否则他看不到更改(不,这不是服务器缓存 [memcached/apc] 问题)
      【解决方案3】:

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

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

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

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-12-16
        • 1970-01-01
        • 2018-12-24
        • 2014-09-08
        • 2023-03-23
        • 1970-01-01
        • 2016-06-30
        • 2011-09-26
        • 2014-01-06
        相关资源
        最近更新 更多