如何强制Apache使用手动预压缩的CSS和JS文件的gz文件?

Fro*_*dik 29 apache caching gzip

我有一个简单的问题.我有webdirectory /css,里面是文件style.css.我手动gzipped这个文件并保存为style.css.gz.我想节省CPU周期,以便在每次请求时都没有压缩CSS文件.如何配置Apache以查找此.gz文件并提供它而不是.css一遍又一遍地压缩文件?

注意:我不希望Apache自己创建.gz文件.在我的场景中,我必须.css.gz手动创建文件 - 在特定请求上使用PHP.

reg*_*ero 54

一些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]
Run Code Online (Sandbox Code Playgroud)

这将成为工作.<Directory foo/>如果您无权访问apache配置或者想要减慢Web服务器的速度,可以将其放在一个部分或.htaccess文件中.

  • 大声笑 - 关于htaccess和放慢网络服务器的好评;-) (6认同)
  • 老答案但仍然非常有用.在我的情况下(1and1托管)我不得不将`RewriteRule`s'更改为`RewriteRule ^(.*)\.css%{REQUEST_URI}\.gz [QSA]`和`RewriteRule ^(.*)\.js% {REQUEST_URI}\.gz [QSA]`.否则服务器返回404.希望它能帮助别人. (4认同)

小智 11

继续使用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
Run Code Online (Sandbox Code Playgroud)

  • http://httpd.apache.org/docs/2.4/mod/mod_deflate.html#precompressed 描述了类似的内容。他们还提到了“标头追加 Vary Accept-Encoding”。 (2认同)

Kev*_*oid 7

您可能希望使用此问题中讨论的内容,而不是自己使用mod_rewrite(并错过更高级的功能,如q值,状态406,TCN等)来实现内容协商.从那里复制我的答案: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>
Run Code Online (Sandbox Code Playgroud)

这对所有的工作的好处.gz的文件,而不是仅仅.css.gz.js.gz和容易地扩展额外的编码.

它确实有一个主要缺点,因为只有对不存在的文件的foo.js请求才会被协商,一个名为的文件会请求/foo.js(但不会/foo)返回未压缩的版本.这可以通过使用FrançoisMarier解决方案重命名具有双扩展名的未压缩文件来避免,因此foo.js部署为foo.js.js.如果此限制对您的部署过程来说不是太痛苦,那么使用mod_negotiation可能值得考虑.


Spl*_*iFF 6

我意识到这不是你问的问题,但无论如何我都把它扔出去了.你有没有考虑简单地使用mod_cachemod_gzip?使用正确的配置,apache将为您压缩文件,然后将压缩的缓存文件传递给客户端和下游代理.这比您在时间和精力方面的建议更有效,并且在带宽和计算负荷方面同样有效.

PHP首先压缩文件并不重要,因为正确设置mod_gzip会检测到这一点.重点是你可以缓存压缩文件,Apache不会重新压缩它们.