【发布时间】: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_deflate、mod_mime 和mod_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 中做什么来禁用所有文件的压缩吗?
标签: apache .htaccess drupal mod-rewrite apache2