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

如何强制Apache使用CSS和JS文件的手动预压缩gz文件?,apache,caching,gzip,Apache,Caching,Gzip,我有一个简单的问题。我有webdirectory/css,里面是filestyle.css。我已经手动压缩了这个文件,并将其保存为style.css.gz。我想节省CPU周期,以避免每次请求时压缩CSS文件。我如何配置Apache来查找这个.gz文件并提供它,而不是一次又一次地压缩.css文件 注意:我不希望Apache创建.gz文件本身。在我的场景中,我必须手动创建.css.gz文件-在特定请求中使用PHP。一些重写规则应该可以很好地处理这个问题 在Drupal配置文件中,我发现: # Add

我有一个简单的问题。我有webdirectory
/css
,里面是file
style.css
。我已经手动压缩了这个文件,并将其保存为
style.css.gz
。我想节省CPU周期,以避免每次请求时压缩CSS文件。我如何配置Apache来查找这个
.gz
文件并提供它,而不是一次又一次地压缩
.css
文件


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

一些重写规则应该可以很好地处理这个问题

在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服务器的速度,您可以将其放在
部分或.htaccess文件中。

这不正是您所寻找的一步一步的方法吗

我们检查这个gzip版本的文件是否存在(第四行),如果存在,我们会将.gz附加到请求的文件名中


我知道这不是你要的,但我还是要把它扔出去。您是否考虑过将
mod\u cache
mod\u gzip
一起使用?使用正确的配置,apache将为您gzip文件,然后将压缩的缓存文件传递给客户端和下游代理。在时间和精力方面,这比您所建议的更有效,在带宽和计算负载方面也同样有效


PHP是否先压缩文件并不重要,因为如果设置正确,mod_gzip将检测到这一点。要点是,您可以缓存压缩文件,Apache不会重新压缩它们。

继续regilero answer,您还应该添加几行,以确保服务器使用相应的内容编码头进行应答:

#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_rewrite
实现您自己不同(并错过了更高级的功能,如、、等),您可能希望使用
mod_协商
,如中所述。从那里复制:

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>
选项+多视图
RemoveType.gz
AddEncoding gzip.gz
RemoveEncoding.gz
#注意:可以使用application/x-gzip实现向后兼容性
AddType应用程序/gzip.gz
这增加了一个额外的好处,即可以处理所有
.gz
文件,而不仅仅是
.css.gz
.js.gz
文件,并且可以轻松扩展以进行其他编码


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

我对建议的解决方案有些费劲。对于其他使用具有不同DocumentRoots的VirtualHosts的用户,您只需将RewriteCond更改为:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}\.gz -s

LOL-关于htaccess和降低Web服务器速度的好评论;-)我已经设置了您的解决方案,但是交付资源(JS+CSS)的等待时间平均仍高达50-100毫秒,因此我假设Apache没有使用这些规则,或者有些事情是错误的,因为在提供静态文件时,Chrome中的开发工具中显示的等待时间应该更小,对吗?检查请求接受编码是否真的是gzip。事实上,您在接受编码中可能有几个值,这可能会破坏它。通常我在服务器后面使用Varnish,这个头是变体的更简单版本:。尝试将接受结束的RewriteCond与您拥有的一个匹配(
RewriteCond%{HTTP:Accept encoding}gzip,deflate
)到sse,如果它来自这个问题的答案,但仍然非常有用。在我的情况下(1和1托管),我必须将
重写规则
s更改为
重写规则^(.*)\.css%{REQUEST\u URI}\.gz[QSA]
重写规则^(.*)\.js%{REQUEST\u URI}\.gz[QSA]
。否则,服务器返回404。希望它能帮助其他人。尝试了
.js
.json
;最后在RewriteRule的模式端附加了
$
字符串结束锚定:
RewriteRule^(.*)js$$1\.js\.gz[QSA]
…否则js重写会捕获.json文件并将它们重写到.json.gz而不是.json.gz。是的,它看起来非常有希望。但我对狩猎有点困惑。这篇博文来自2007年,没有更多关于Safari不能正确使用gzip内容的细节。关于Safari还有更多的细节吗?主要是如果今天的版本运行正常的话?我不能相信Safari在2012年不能正确处理这个问题。但是,我会让您检查:)。这里有一点信息:在我看来,规则与雷吉勒罗首先提到的完全相同。在我的CDN上,Apache将所有js和css文件请求重写为一个php脚本,如果浏览器接受,该脚本将提供压缩文件,否则将提供缩小文件。它首先比较两个文件(原始文件和压缩文件)的最后修改时间,并仅在需要时生成压缩文件。如果您使用PHP并且感兴趣,我可以粘贴它。感谢本附录,我首先尝试使用regilero的解决方案,但是返回的文件没有
内容编码
标题,因此无法正常工作。描述了类似的东西。他们还提到了
头附加Vary Accept Encoding
。Apache将自动将
RewriteCond
使用的头添加到
Vary
如果HTTP头在某个条件下使用,该头将添加到响应的Vary头中。(另请参见“novary”旗)mems的好成绩。你说得很对,我支持你