【问题标题】:YSlow gives F grade to files compressed with mod_deflateYSlow 为使用 mod_deflate 压缩的文件提供 F 级
【发布时间】:2010-11-01 17:14:10
【问题描述】:

我在 Apache 2.2 上使用 mod_deflate,压缩级别设置为 9。我已根据YSlow (v2) 并且在所有类别中都获得了 A 级(总分:91),除了:

  • 减少 HTTP 请求(C 级 - 我还在继续努力 图像统一)
  • 使用 gzip 压缩组件(Grade F)

YSlow 仍然返回 F 并告诉我在我的 CSS 和 JS 文件上使用 gzip。这是 YSlow 报告的屏幕截图(出于隐私考虑,域已被模糊处理)

然而,像 GIDNetwork GZIP Test 这样的网站报告完美压缩!!

我的 .htaccess 的 mod_deflate 部分

# Below uses mod_deflate to compress text files. Never compress binary files.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE

# compress content with type html, text, js, and css
AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript text/xml image/svg+xml application/javascript application/x-javascript application/atom_xml application/rss+xml application/xml application/xhtml+xml application/x-httpd-php application/x-httpd-fastphp

# Properly handle old browsers that do not support compression  
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# Explicitly exclude binary files from compression just in case
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.avi$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mov$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp3$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp4$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.rm$ no-gzip dont-vary

# properly handle requests coming from behind proxies
Header append Vary User-Agent env=!dont-vary
</IfModule>

谁能指出我哪里出错了?

谢谢, m^e

【问题讨论】:

    标签: compression gzip yslow mod-deflate


    【解决方案1】:

    可能是 mod_deflate 配置不正确。

    典型的 mod_deflate 配置可能会根据用户代理字符串排除某些浏览器,并且可能仅配置为压缩某些文件类型 - 由它们在服务器上注册的 MIME 类型标识。

    您应该压缩所有 HTML、CSS 和 Javascript 文件,而不是 PNG、GIF 或 JPEG 文件,而且 Netscape 4 中存在您可能想或不想考虑的错误。尝试使用sample code from the documentation

    <Location />
        # Insert filter
        SetOutputFilter DEFLATE
    
        # Netscape 4.x has some problems...
        BrowserMatch ^Mozilla/4 gzip-only-text/html
    
        # Netscape 4.06-4.08 have some more problems
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
    
        # MSIE masquerades as Netscape, but it is fine
        BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
        # Don't compress images
        SetEnvIfNoCase Request_URI \
        \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    
        # Make sure proxies don't deliver the wrong content
        Header append Vary User-Agent env=!dont-vary
    </Location> 
    

    还要注意,您发布的 GIDZipTest GZIP 测试不会测试关联的 Javascript 和 CSS 文件,而 YSlow 会 - 在 GIDZipTest GZIP 测试中,您需要单独测试这些文件。

    我猜您的 ISP 也有可能正在使用缓存代理(无论是否透明),它正在破坏或删除您的 Accept-Encoding: 标头。要排除这个原因,您可以让别人从您的 ISP 之外对其进行测试。

    另外需要注意的是,当使用 gzip 压缩文件时,您是在用带宽换取 CPU 时间。在较低的压缩强度之上,您将看到带宽节省的回报递减,但所需的 CPU 时间却大幅增加。不幸的是,压缩强度高达 9,您几乎肯定会浪费太多的 CPU 时间来改善压缩效果 - 我总是建议使用 1 的强度。

    【讨论】:

    • 我已经在上面添加了我的 htaccess 的 deflate 部分......它或多或少与您在此处显示的示例相匹配。至于 CPU 时间,我们在专用服务器上运行,没有其他进程(MySQL 除外)与 Apache 一起运行。在这种情况下是否应该关注 CPU 利用率?
    • 至于 GIDZipTest,我听从了您的建议,分别检查了 JS 和 CSS 文件的压缩率,而不是整个页面……它报告的压缩率分别为 70% 和 77.3%。
    • 在 Firefox 上,您是否有可能通过代理访问该站点?代理可能会丢弃浏览器发送的 Accept-Encoding: 标头,以便缓存它(代理也可以是透明的)。让您的 ISP 外部人员使用他们自己的 Firefox 进行检查将确认或排除其原因。
    • 我完全忘记了这篇文章......因为中途我的问题得到了解决。事实上,这是由于在我的工作场所雇用的代理人。他们摆脱了它,一切都很好:)感谢所有帮助..
    【解决方案2】:

    要对 ASP.NET 做同样的事情,请阅读这篇文章 - http://coder.informisk.com/post/2010/01/10/Get-Grade-A-in-YSlow.aspx

    【讨论】:

      【解决方案3】:

      这个网站http://www.rubyrobot.org/article/5-tips-for-faster-loading-web-sites 告诉我 AddOutputFilterByType 在 .htaccess 中不起作用

      【讨论】:

      • 这只是部分正确。 AddOutputFilterByType 在 Apache 2.0.33 及更高版本中可用,甚至 2.2 仍然有它(不过,它自 2.1 起已被弃用)。 all contexts, 包括 .htaccess.
      猜你喜欢
      • 2012-10-16
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多