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

Posted

技术标签:

【中文标题】如何为 .htaccess 文件中的某些媒体文件禁用 Apache gzip 压缩?【英文标题】:How to disable Apache gzip compression for some media files in .htaccess file? 【发布时间】:2012-03-04 04:32:27 【问题描述】:

我想对一些已经在 Apache 服务器上通过 .htaccess 文件压缩的​​媒体文件禁用 gzip 压缩。 原因:因为它写在例如jPlayer's site,应该为媒体文件禁用 gzip 编码:“媒体文件已经被压缩,GZIP 只会浪费你服务器上的 CPU。如果你 GZIP 媒体,Adobe Flash 插件会遇到问题。”

我目前遇到的问题是,启用 gzip 时未正确设置 Content-Length 标头 - 因此,当使用 SoundManager2 播放器播放一些 mp3 文件时,曲目的长度进度条无法正常工作(所以也许这就是他们在 jPlayer 网站上讲述的问题)。

我可以测试内容是否被压缩here。 我在服务器上启用了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,但它们不起作用(有 6 种不同的尝试!-也许其中一些必须在 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

【问题讨论】:

如果媒体文件在不同的文件夹中,您可以将带有工作行的htaccess放在该文件夹中,并且不影响网站的其他部分。 +1,这是一个可能的解决方案,但不能绝对确定我的媒体文件进入某个目录,所以我想让它更“灵活”。 :) @SkBerPeter - 你有一些使用 [L] 标志的 mod_rewrite 规则吗?在 .htaccess 文件中进行重写工作(而不是在更早发生的 .conf 文件中进行)是一个巨大的混乱,其中包括稍微改变 [L] 的动作。 [L] 不是退出,而是循环回到 .htaccess 的顶部,作为副作用,所有环境变量都被清除!也许这就是您设置“no-gzip”的原因,但是当被引用时,它似乎不再被设置。如果它可用(2.3.9 和更高版本)也许 [END] 标志会更好。 @SkPerPeter 而不是笼统的“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 类型的音频文件打开,因此无需将其关闭。 (另请注意,对于已经压缩的文件,它打开,因为它弊大于利。) 知道我可以在全局 httpd.conf 中做什么来禁用所有文件的压缩吗? 【参考方案1】:

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

我做了两件事。

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

    <Files "*.gz.asc">
         RemoveEncoding .gz
     </Files>
    

    放一条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

【讨论】:

【参考方案2】:

要在我的 Apache 服务器上仅对 Adob​​e 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>

【讨论】:

【参考方案3】:

这似乎已经过时了:https://www.varnish-cache.org/docs/3.0/tutorial/compression.html#gzip-and-esi

GZIP 和 ESI

如果您使用 Edge Side Includes,您会很高兴注意到 ESI 和 GZIP 配合得非常好。 Varnish 会神奇地解压 进行 ESI 处理的内容,然后重新压缩以提高效率 存储和交付。

【讨论】:

【参考方案4】:

我必须禁用 odp 文件的压缩以供外部插件使用 刚刚在 .htaccess 文件中添加了以下规则

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

并且服务器禁用了 odp 文件的压缩 请务必在测试前清除浏览器缓存

【讨论】:

【参考方案5】:

你是不是通过使用指令SetOutputFilter DEFLATE 来解决这个错误,然后尝试为已经包含某种形式的压缩的流禁用它? not 使用这个指令然后压缩可压缩的流不是更容易吗?例如

<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”...但更糟糕的是,Content-Length 标头仍然存在播放 mp3 文件或访问任何其他页面时未设置,由于播放器的原因,这在提供媒体文件时很糟糕。如果我使用全局 RewriteRule ^(.*)$ $1 [NS,E=no-gzip:1,E=dont-vary:1] 行,则会设置 Content-Length 标头并且每个播放器都可以正常工作。但是全局禁用 gzip 并不是一个好主意。 :( 请查看我编辑的问题,我在播放时粘贴了 mp3 文件的响应标头,无论是否使用上述工作 RewriteRule(查看 pastebin 链接)。谢谢! 这些响应标头正是我所期望的,无论是否在流上进行 deflate 工作。您没有评论您是否已注释掉 SetOutputFilter DEFLATE 行,您需要这样做才能使其正常工作。 同样在 Header 指令上,这确实假设 mod_headers 已加载;如果您的托管服务提供商未加载此内容,您将获得 500。对不起。 我完全删除了我自己的尝试并将您的代码粘贴到我的 .htaccess 中,但不幸的是它并没有解决问题。也许它与 Drupal 太相关了:通过 SoundManager2 播放器 (goo.gl/gCdbq) 播放的音轨正在发生,因此它通过了音频模块的 audio_play() 函数,该函数位于:drupalcontrib.org/api/drupal/…。如您所见,它发送适当的标头以禁用压缩。不太明白它后来是如何被“覆盖”的:响应中没有 Content-Length。【参考方案6】:

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

【讨论】:

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

以上是关于如何为 .htaccess 文件中的某些媒体文件禁用 Apache gzip 压缩?的主要内容,如果未能解决你的问题,请参考以下文章

如何为多个子目录制定htaccess重写规则

如何为Flex Mobile中的某些视图启用方向更改?

SVN中如何为文件夹中的所有文件加锁

htaccess 对特定文件夹暂时不可用

如何为 Laravel 发布和自定义 .htaccess?

.htaccess 如何为 public_html cpanel 工作