我有Apache 2.2.22在Debian上运行。
我曾尝试在服务器上启用deflate,但不pipe我做什么,响应都没有收缩。
以下是启用的模块列表:
apache2ctl -M Loaded Modules: core_module (static) log_config_module (static) logio_module (static) version_module (static) mpm_prefork_module (static) http_module (static) so_module (static) alias_module (shared) auth_basic_module (shared) authn_file_module (shared) authz_default_module (shared) authz_groupfile_module (shared) authz_host_module (shared) authz_user_module (shared) autoindex_module (shared) cgi_module (shared) deflate_module (shared) dir_module (shared) env_module (shared) expires_module (shared) filter_module (shared) headers_module (shared) mime_module (shared) negotiation_module (shared) pagespeed_module (shared) php5_module (shared) reqtimeout_module (shared) rewrite_module (shared) setenvif_module (shared) status_module (shared) Syntax OK
这是我的虚拟主机:
<VirtualHost 148.251.236.145:80> ServerName www.tren.at ServerAlias tren.at *.tren.at ServerAdmin [email protected] DocumentRoot /var/www/tren ServerSignature on LogLevel info ErrorLog /var/log/apache2/error-tren.log CustomLog /var/log/apache2/access-tren.log combined RewriteLog /var/log/apache2/rewrite-tren.log RewriteLogLevel 3 AllowEncodedSlashes on <Directory /var/www/tren/> Options Indexes FollowSymLinks MultiViews AllowOverride all Order allow,deny Allow from all DirectoryIndex index.php </Directory> <Directory /var/www/tren/images/> <FilesMatch "(?i)\.((?!.*(jpg|jpeg|png|gif|bmp)).*)$"> Order Deny,Allow Deny from All </FilesMatch> </Directory> <Directory /var/www/tren/cache/> <FilesMatch "(?i)\.((?!.*(jpg|jpeg|png|gif|bmp)).*)$"> Order Deny,Allow Deny from All </FilesMatch> </Directory> </VirtualHost>
最后这里是我的.htaccess
Options -MultiViews Options +FollowSymLinks # Enable GZIP <IfModule mod_deflate.c> # HTML, TXT, CSS, JavaScript, JSON, XML, HTC: <IfModule filter_module> FilterDeclare COMPRESS FilterProvider COMPRESS DEFLATE resp=Content-Type $text/html FilterProvider COMPRESS DEFLATE resp=Content-Type $text/css FilterProvider COMPRESS DEFLATE resp=Content-Type $text/plain FilterProvider COMPRESS DEFLATE resp=Content-Type $text/xml FilterProvider COMPRESS DEFLATE resp=Content-Type $text/x-component FilterProvider COMPRESS DEFLATE resp=Content-Type $application/javascript FilterProvider COMPRESS DEFLATE resp=Content-Type $application/json FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xml FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xhtml+xml FilterProvider COMPRESS DEFLATE resp=Content-Type $application/rss+xml FilterProvider COMPRESS DEFLATE resp=Content-Type $application/atom+xml FilterProvider COMPRESS DEFLATE resp=Content-Type $application/vnd.ms-fontobject FilterProvider COMPRESS DEFLATE resp=Content-Type $image/svg+xml FilterProvider COMPRESS DEFLATE resp=Content-Type $application/x-font-ttf FilterProvider COMPRESS DEFLATE resp=Content-Type $font/opentype FilterChain COMPRESS FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no </IfModule> <IfModule !mod_filter.c> # Legacy versions of Apache AddOutputFilterByType DEFLATE text/html text/plain text/css application/json AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE text/xml application/xml text/x-component AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml AddOutputFilterByType DEFLATE application/atom+xml AddOutputFilterByType DEFLATE image/svg+xml application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-font-ttf font/opentype </IfModule> </IfModule> # Expires Headers - 2678400s = 31 days <ifmodule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 seconds" ExpiresByType text/html "access plus 7200 seconds" ExpiresByType image/gif "access plus 2678400 seconds" ExpiresByType image/jpeg "access plus 2678400 seconds" ExpiresByType image/png "access plus 2678400 seconds" ExpiresByType text/css "access plus 518400 seconds" ExpiresByType text/javascript "access plus 2678400 seconds" ExpiresByType application/x-javascript "access plus 2678400 seconds" </ifmodule> # Cache Headers <ifmodule mod_headers.c> # Cache specified files for 31 days <filesmatch "\.(ico|flv|jpg|jpeg|png|gif|css|swf)$"> Header set Cache-Control "max-age=2678400, public" </filesmatch> # Cache HTML files for a couple hours <filesmatch "\.(html|htm)$"> Header set Cache-Control "max-age=7200, private, must-revalidate" </filesmatch> # Cache PDFs for a day <filesmatch "\.(pdf)$"> Header set Cache-Control "max-age=86400, public" </filesmatch> # Cache Javascripts for 31 days <filesmatch "\.(js)$"> Header set Cache-Control "max-age=2678400, private" </filesmatch> </ifmodule> RewriteEngine on RewriteBase / RewriteRule . - [E=no-gzip:1] RewriteRule ^(.*)/product/([0-9]+)/(.*)$ product_info.php/products_id/$2/$3 [QSA,L] RewriteRule ^(.*)/product/([0-9]+)$ product_info.php?products_id=$2 [QSA,L] RewriteRule ^(.*)/cat/([0-9,_]+)/(.*)$ index.php/cPath/$2/$3 [QSA,L] RewriteRule ^(.*)/cat/([0-9,_]+)$ index.php?cPath=$2 [QSA,L] ## Redirect to www # RewriteCond %{http_host} ^tren.at [nc] RewriteRule ^(.*)$ http://www.tren.at/$1 [r=301,nc]
如果我现在尝试从网站获取一个简单的html文件,它没有被压缩。 php输出也一样:
curl --compressed -I http://www.tren.at/test.html HTTP/1.1 200 OK Date: Wed, 22 Apr 2015 10:37:57 GMT Server: Apache/2.2.22 (Debian) Last-Modified: Wed, 12 Nov 2014 10:34:38 GMT Accept-Ranges: none Cache-Control: max-age=7200, private, must-revalidate Expires: Wed, 22 Apr 2015 12:37:57 GMT Content-Length: 322 Content-Type: text/html
我已经在php.ini中禁用了output_buffering和zlib.output_compression。
在我的configuration中是否有错误? 还有什么我可以尝试find问题/解决这个问题?
编辑:
有趣的是,当我在configuration中发生语法错误时,我得到的500错误是gzipped!
我有以下,这是有效的,看起来很不同于你的。 如果你简化你的configuration大致是这样呢?
SetOutputFilter DEFLATE AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript
此外,不要忘了使用Vary: Accept-Encoding而不要使用 Vary: User-Agent如果你能避免的话。 您可能还想调整传入的Accept-Encoding请求标头(如果有的话)。 否则,你会得到真正的垃圾caching命中率,因为你会caching所有不同的压缩技术和所有不同的用户代理string的40多个不同的表示forms。
这里是我将把一个反向代理来实现这一点。
# Edit incoming request header Accept-Encoding in order # to get greater cache utilisation and less disk utilisation. Otherwise we # end up with a lot of (potentially different) encodings; one for each unique # Accept-Encoding header... there would be over 50; including very unusual # ones. # # This pair of regular expressions implements a two-part transform which: # 1) for any Accept-Encoding header which has gzip, makes it the only value, # plus adds a dummy value to remind log-observers that it has been edited. # 2) then, it will replace any Accept-Encoding that did not mention gzip, # clears it out. mod_deflate only supports gzip anyway (despite the name) # # I was afraid that this would have to run as an 'early' handler, and perhaps # on older versions of Apache 2.2, perhaps that would be the case; but at least # for httpd-2.2.3-91.el5 on RHEL 5, this is not the case. I think there was # some talk of making the caching not and early module... but I believe the # documentation still refers to it as an early module. # RequestHeader edit Accept-Encoding "^(?:.*,?\s*)?\b(gzip)\b(?:,.*)?$" "$1, MASHED" RequestHeader edit Accept-Encoding "^(?!.*\bgzip\b.*).*$" "$1"
MASHED在很大程度上是为了我的好处,提醒已经编辑了标题。
罪魁祸首是重写mod中的一个规则:
RewriteRule . - [E=no-gzip:1]
这是我忘记的旧configuration的一部分。