У меня есть унаследованный сервер Apache 2.2.17, работающий на Ubuntu, и мне нужно включить сжатие. Я убедился, что мод загружен:
apachectl -t -D DUMP_MODULES
Loaded Modules:
...
deflate_module (shared)
headers_module (shared)
setenvif_module (shared)
...
Затем я установил http.conf
со следующими правилами:
<IfModule deflate_module>
SetOutputFilter DEFLATE
<IfModule setenvif_module>
# Netscape 4.x has some problems
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48, the above regex won’t work. You can use the following
# workaround (comment the above line and uncomment the below line) to get the desired effect:
# BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don’t compress already-compressed files
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:avi|mov|mp3|mp4|rm|flv|swf|mp?g)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .pdf$ no-gzip dont-vary
</IfModule>
<IfModule headers_module>
# Make sure proxies don’t deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</IfModule>
</IfModule>
Теперь, если я получу HEAD
используя python или curl, я получаю ответ gzip (это только для .txt
файл, но единообразно по всему сайту):
Date: Mon, 06 May 2013 11:53:31 GMT
Server: Apache/2.2.17 (Ubuntu)
Last-Modified: Sun, 05 May 2013 12:37:23 GMT
ETag: "2412002-129c6-4dbf7d88766c0"
Accept-Ranges: bytes
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Content-Length: 32607
Content-Type: text/plain
Однако если я сделаю POST
или GET
, Я не получаю gzip обратно:
Date: Mon, 06 May 2013 11:53:25 GMT
Server: Apache/2.2.17 (Ubuntu)
Last-Modified: Sun, 05 May 2013 12:37:23 GMT
ETag: "2412002-129c6-4dbf7d88766c0"
Accept-Ranges: bytes
Vary: Accept-Encoding,User-Agent
Content-Type: text/plain
Content-Length: 76230
ОБНОВИТЬ: Вот заголовки из Firefox 20
. Firebug и Google подтверждают, что запрашивается gzip:
Date: Tue, 07 May 2013 16:57:01 GMT
Server: Apache/2.2.17 (Ubuntu)
X-Powered-By: PHP/5.3.5-1ubuntu7.10
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding,User-Agent
Keep-Alive: timeout=15, max=98
Connection: Keep-Alive
Content-Type: text/html
Content-Length: 19922
Это расстраивает меня уже несколько дней, и любая помощь будет очень признательна.
Спасибо
Как оказалось, конфигурация на самом деле не очень хорошо запускалась, и сайт всегда выбирал deflate вместо gzip. Таким образом, я не видел, чтобы это работало. Я упростил свой http.conf
, и включил журнал linux, который показал, что он действительно работает:
LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ \
no-gzip dont-vary
SetEnvIfNoCase Request_URI \
\.(?:exe|t?gz|zip|bz2|sit|rar)$ \
no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
DeflateFilterNote Input input_info
DeflateFilterNote Output output_info
DeflateFilterNote Ratio ratio_info
LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
CustomLog /var/log/apache2/deflate_log deflate
В последнем разделе был написан журнал, который показал, что некоторый контент фактически сжимается. Некоторые из них все еще не работают, но я считаю, что теперь это связано с тем, как работает php. Я собираюсь изучить также использование сжатия php, чтобы лучше справиться с этим.
И спасибо Marcel & Chris S за то, что помогли мне разобраться.