我有一个简单的问题。 我有webdirectory /css ,里面是文件style.css 。 我手动gzip这个文件,并将其保存为style.css.gz 。 我想节省CPU周期,不要在每个请求压缩CSS文件。 如何configurationApache来查找这个.gz文件并提供它,而不是一遍又一遍压缩.css文件?
注意:我不希望Apache自己创build.gz文件。 在我的scheme中,我必须手动创build.css.gz文件 – 在特定请求上使用PHP。
一些RewriteRule应该处理得很好。
在一个Drupal配置文件中,我发现:
# AddEncoding allows you to have certain browsers uncompress information on the fly. AddEncoding gzip .gz #Serve gzip compressed CSS files if they exist and the client accepts gzip. RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}\.gz -s RewriteRule ^(.*)\.css $1\.css\.gz [QSA] # Serve gzip compressed JS files if they exist and the client accepts gzip. RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}\.gz -s RewriteRule ^(.*)\.js $1\.js\.gz [QSA] # Serve correct content types, and prevent mod_deflate double gzip. RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1] RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]
这将使工作。 如果你不能访问apache配置,或者你想放慢你的web服务器,你可以把它放在<Directory foo/>部分或者.htaccess文件中。
继续regilero答案你还应该添加几行,以确保服务器与相应的Content-Encoding标题答案:
#Serve gzip compressed CSS files if they exist and the client accepts gzip. RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}\.gz -s RewriteRule ^(.*)\.css $1\.css\.gz [QSA] # Serve gzip compressed JS files if they exist and the client accepts gzip. RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}\.gz -s RewriteRule ^(.*)\.js $1\.js\.gz [QSA] # Serve correct content types, and prevent mod_deflate double gzip. RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1,E=is_gzip:1] RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=is_gzip:1] Header set Content-Encoding "gzip" env=is_gzip
我意识到这不是你所问的,但是我反正把它扔出去了。 你有没有考虑简单地使用mod_cache与mod_gzip ? 通过正确的配置,apache将为您压缩文件,然后将压缩后的缓存文件传递给客户端和下游代理。 这比在时间和精力方面所提出的方法更有效率,而且在带宽和计算负载方面同样有效。
PHP没有压缩文件,因为使用正确的设置mod_gzip会检测到。 主要的一点是你可以缓存压缩文件,Apache不会重新压缩它们。
这篇博客文章是不是你一直在寻找的一步一步?
我们检查这个gzipped文件的版本是否存在(第四行),如果是这样,我们将.gz附加到所需的文件名
而不是自己使用mod_rewrite实现内容协商 (并且错过了诸如q值 , 状态406 , TCN等更高级的特性),你可能需要使用mod_negotiation来mod_negotiation 这个问题 。 从那里复制我的答案 :
Options +MultiViews RemoveType .gz AddEncoding gzip .gz <FilesMatch ".+\.tar\.gz$"> RemoveEncoding .gz # Note: Can use application/x-gzip for backwards-compatibility AddType application/gzip .gz </FilesMatch>
这为所有的.gz文件提供了额外的好处,而不仅仅是.css.gz和.js.gz文件,并且可以很容易地扩展到其他编码。
它有一个主要的缺点,因为只有不存在的文件的请求被协商,一个名为foo.js的文件会请求/foo.js (而不是/foo )返回未压缩的版本。 这可以避免使用弗朗索瓦·马里尔的解决方案重新命名带有双扩展名的未压缩文件,所以foo.js部署为foo.js.js 如果这个限制对于部署过程来说不是太痛苦,那么使用mod_negotiation可能是值得考虑的。