我使用预先编写的gzipedCSS和JS文件,因此服务器不会即时执行此操作。
所以在同一个文件夹中,我有文件.css(gziped版本),file.nozip.css(nogzip版本)。然后,根据浏览器是否接受gzip文件,发送正确的版本。
所以我在 .htaccess 中有以下内容:
RewriteEngine On
RewriteRule ^(.*).[0-9]+.css$ $1.css [L]
#redirect Konqueror and "old browsers"
RewriteCond %{REQUEST_FILENAME} !.nogzip.css$
RewriteCond %{HTTP:Accept-encoding} !gzip [OR]
RewriteCond %{HTTP_USER_AGENT} Konqueror
RewriteRule ^(.*).css$ $1.nogzip.css [L]
<IfModule mod_headers.c>
Header set Vary User-Agent
#set Content-Encoding for all css files
<FilesMatch .*.css$>
Header set Content-Encoding: gzip
Header set Cache-control: private
</FilesMatch>
#drop Content-Encoding in case we send not gzipped file
<FilesMatch .*.nogzip.css$>
Header unset Content-Encoding
</FilesMatch>
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A36000000
</IfModule>
这种方法我之前在Windows和Linux服务器上都使用过很多次。一直工作正常。
但是,最近在开发另一个站点时,我遇到了浏览器无法将 gzip 文件识别为 gzip 压缩的问题。
在本地主机上正常工作,这是响应标头:
Accept-Ranges:bytes
Cache-control:private
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:39115
Content-Type:text/css
Date:Wed, 17 Jun 2015 11:27:28 GMT
ETag:"98cb-517998d9e690c"
Keep-Alive:timeout=5, max=100
Last-Modified:Wed, 03 Jun 2015 09:19:16 GMT
Server:Apache/2.4.12 (Win64) OpenSSL/1.0.1m PHP/5.6.9
Vary:User-Agent
X-Distributed-by:AHC
这是从生产服务器收到的标头(不起作用 - css 文件在浏览器中显示为压缩):
Accept-Ranges:bytes
Cache-control:private
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:39099
Content-Type:text/css
Date:Wed, 17 Jun 2015 11:30:08 GMT
ETag:"98cb-517998d8fcd00-gzip"
Keep-Alive:timeout=5, max=99
Last-Modified:Wed, 03 Jun 2015 09:19:16 GMT
Server:Apache/2.4.10 (Debian)
Vary:User-Agent
唯一的区别是"X-Distributed-by:AHC",但这几乎不是问题的原因。
有什么想法要检查吗?
在情况 2 中,由于 etag mod_deflate强烈暗示它动态压缩:
ETag:"98cb-517998d8fcd00-gzip"
也许最好为例如 konqueror 案例设置 no-gzip?