如何在.htaccess文件中禁用Apache对某些媒体文件的gzip压缩?

18
我想在Apache服务器上通过.htaccess文件禁用部分已经压缩的媒体文件的gzip压缩。
原因:正如jPlayer网站所述,应该禁用媒体文件的gzip编码:"媒体文件已经被压缩,GZIP只会浪费服务器上的CPU。Adobe Flash插件将在您使用GZIP媒体时出现问题。"

目前我面临的问题是,在启用gzip时未正确设置Content-Length头-因此,当使用SoundManager2播放器播放一些mp3文件时,曲目长度进度条无法适当工作(因此也许那就是jPlayer网站上所说的问题)。

我可以在这里测试内容是否为gzipped。
我在服务器上启用了mod_deflatemod_mimemod_rewrite模块。
根据phpinfo(),以下是所有加载的模块列表:

core mod_log_config mod_logio itk http_core mod_so mod_alias mod_auth_basic mod_authn_file mod_authz_default mod_authz_groupfile mod_authz_host mod_authz_user mod_autoindex mod_cgi mod_dav mod_dav_svn mod_authz_svn mod_deflate mod_dir mod_env mod_mime mod_negotiation mod_php5 mod_reqtimeout mod_rewrite mod_setenvif mod_ssl mod_status

我正在使用Drupal 6,所以我已经有了一个RewriteRule,它是以下内容:

# Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

我已经尝试了以下六种方法来禁用gzip,但它们都没有生效:(也许其中一些需要在Apache的httpd.conf中设置全局参数?)

  • # http://www.cyberciti.biz/tips/speed-up-apache-20-web-access-or-downloads-with-mod_deflate.html
    SetOutputFilter DEFLATE
    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    
    
  • ## Step 2. here: http://www.mydigitallife.info/how-to-enable-mod_deflate-gzip-compression-on-cpanel-web-hosts/
    <IfModule mod_deflate.c>
    SetOutputFilter DEFLATE
    
    RemoveOutputFilter mp3
    # Don’t compress already-compressed files
    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 .(?:avi|mov|mp3|mp4|rm|flv|swf|mp?g)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI .pdf$ no-gzip dont-vary
    </IfModule>
    
  • RemoveOutputFilter mp3
    
  • # for files that end with ".mp3"
    <FilesMatch \.mp3$>
    SetEnv no-gzip 1
    </FilesMatch>
    
  • RewriteRule \.mp3$ - [NS,E=no-gzip:1,E=dont-vary:1]
    
  • RewriteRule ^((.*)\.mp3)$ $1.mp3 [NS,E=no-gzip:1,E=dont-vary:1]   
    

唯一一个可以正确工作并禁用gzip压缩的选项,但它是全局设置:

  • RewriteRule ^(.*)$ $1 [NS,E=no-gzip:1,E=dont-vary:1]
    

当不使用此RewriteRule时,mp3文件的响应头:http://pastebin.com/AkUZ6m5Y
当使用此RewriteRule时,mp3文件的响应头:http://pastebin.com/b8j3NF6D


1
如果媒体文件在不同的文件夹中,您可以将带有工作行的htaccess放入该文件夹中,而不会影响网站的其他部分。 - Gerben
+1,这是一个可能的解决方案,但不能完全确保我的媒体文件会进入某个特定目录,所以我想让它更加“灵活”。 :) - Sk8erPeter
@SkBerPeter - 你有使用[L]标志的mod_rewrite规则吗?在.htaccess文件中进行重写操作(而不是在.conf文件中,在那里它会发生得早得多)是一个巨大的补救措施,其中之一就是略微更改了[L]的行为。 [L]不是退出而是回到.htaccess文件的顶部,并且副作用是所有环境变量都被清除!也许这就是为什么你设置了“no-gzip”,但引用时似乎不再设置的原因。如果可用(2.3.9及以上版本),也许[END]标志会更好地工作。 - Chuck Kollars
与其使用笼统的“SetOutputFilter”语句,我会使用“AddOutputFilterByType DEFLATE text/html text/css text/javascript application/x-javascript application/javascript application/x-font-ttf application/vnd.ms-fontobject image/svg+xml”来开启压缩……按MIME类型而非扩展名进行设置基本上是相同的,因为通常存在1:1的映射关系。由于它从一开始就没有针对音频文件的MIME类型打开,所以没有必要将其关闭。(还要注意,对于已经压缩的文件,它是关闭的,因为这样做会带来更多的伤害而不是好处。) - Chuck Kollars
有没有什么办法可以在全局httpd.conf中禁用所有文件的压缩? - ajfbiw.s
6个回答

10

我不得不禁用odp文件的压缩,以便外部插件可以使用。我在.htaccess文件中添加了以下规则。

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.odp$ no-gzip dont-vary

服务器已禁用 odp 文件的压缩功能。 请确保在测试之前清除浏览器缓存。


4

使用指令SetOutputFilter DEFLATE,然后尝试禁用已经包含某种压缩形式的流,这样你不是在错误的方向上进行吗?不使用这个指令,然后压缩可压缩的流不是更容易吗?例如:

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript application/javascript application/ecmascript application/rss+xml
</IfModule>

可能还需要添加一个Vary头:

<IfModule mod_headers.c>
    <FilesMatch "\.(js|css|xml|html)$">
        Header append Vary Accept-Encoding
    </FilesMatch>
</IfModule>

好的,这可能会漏掉你没有想到的一些类型,但它将实现你99%以上的压缩潜力。


谢谢你的回答!我试了一下,有趣的是,当我将您在这里粘贴的FilesMatch部分添加到我的全局.htaccess文件中时,然后我会得到一个“500 Internal Server Error”…但更糟糕的是,播放mp3文件或访问任何其他页面时仍未设置Content-Length标头,这对于媒体文件的播放器来说很不好。如果我使用全局的RewriteRule ^(.*)$ $1 [NS,E=no-gzip:1,E=dont-vary:1]行,则设置Content-Length标头并且每个播放器都可以正常工作。但是全局禁用gzip不是一个好主意。:( - Sk8erPeter
请查看我编辑过的问题,我粘贴了播放mp3文件时使用和不使用提到的工作RewriteRule的响应头(请查看pastebin链接)。谢谢! - Sk8erPeter
这些响应头与流上是否启用deflate,正如我所预期的一样。你没有提到是否已经注释掉了SetOutputFilter DEFLATE行,如果要使其工作,那么你需要这样做。 - TerryE
同样在Header指令上,这假定mod_headers已加载;如果您的托管提供商没有加载它,您将收到500错误。抱歉。 - TerryE
我完全删除了自己的尝试,并将您的代码粘贴到我的 .htaccess 文件中,但不幸的是它没有解决问题。也许这与 Drupal 有关:通过 SoundManager2 播放器(http://goo.gl/gCdbq)播放的音轨是通过 Audio 模块的 audio_play() 函数进行的,该函数在此处:http://drupalcontrib.org/api/drupal/contributions!audio!audio.pages.inc/function/audio_play/6。正如您所看到的,它发送适当的标头以禁用压缩。不太明白它是如何被后来的某些方式“覆盖”的:响应中没有 Content-Length。 - Sk8erPeter
我编辑了您的帖子,添加了<IfModule ...>标签,以防止之前遇到的500个内部服务器错误。在调查此案件时,我意识到播放器的“进度条”在Firefox(10.0.2及更早版本)和Opera(11.61)中确实可以工作,因此对于这些浏览器来说,适当的Content-Length头不被提供并不重要。但是在Chrome中,当压缩媒体内容时,浏览器无法获取Content-Length头,并且播放器的进度条无法工作,因此我必须完全在.htaccess中关闭gzip。如何将其限制为音乐和视频内容? - Sk8erPeter

1

为了在我的Apache服务器上仅禁用Adobe Flash Player文件(SWF)的gzip压缩,我将以下内容添加到我的.htaccess文件中:

<IfModule mod_headers.c>
    <FilesMatch "\.swf$">
        RewriteRule ^(.*)$ $1 [NS,E=no-gzip:1,E=dont-vary:1]
    </FilesMatch>
</IfModule>

如果您愿意的话,您也可以禁用其他文件类型的gzip压缩:
<IfModule mod_headers.c>
    <FilesMatch "\.(js|css|swf)$">
        RewriteRule ^(.*)$ $1 [NS,E=no-gzip:1,E=dont-vary:1]
    </FilesMatch>
</IfModule>

0

0

我认为您没有在媒体中使用压缩。您是否检查了是否正在解压文件?该模块可以加载到内存中,但这并不意味着它正在压缩文件。如果您的 .htaccess 文件只有重写规则,则很可能您没有压缩任何类型的内容。


如果你的 .htaccess 文件只有重写规则,那么你很可能没有压缩任何类型的内容。我在这里粘贴了 Drupal 使用的默认 RewriteRule,但为什么会意味着如果在服务器上启用了 gzip 压缩,并且使用了 RewriteRule,则不会压缩任何内容?我对两者之间的联系并不清楚。使用 mod_rewrite 并不意味着压缩被禁用。但最重要的是:在提出任何问题之前,我进行了压缩测试。正如我所提到的,例如在此处可以进行测试:http://goo.gl/WCzQZ,它说是的。 - Sk8erPeter

-1

我知道这个帖子很旧了,但我也曾经走过同样的路。

我做了两件事。

  1. 我完全启用了.htaccess并禁用了一个文件夹的gzip。

    <Files "*.gz.asc">
         RemoveEncoding .gz
     </Files>
    
  2. 放置了一个reqwrite规则来禁用

    RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1] 
    

这两种方法对我来说都有效,我建议先查看Apache文档再去论坛搜索。

如需更多信息,请前往Apache官方网站。

https://httpd.apache.org/docs/2.4/mod/mod_deflate.html https://httpd.apache.org/docs/2.4/mod/mod_mime.html#addtype


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接