предварительно сжатый gzip ломается на хроме, почему?

Я использую предварительно сжатые файлы CSS и JS на своем сайте, а IE6-8 и FF отлично работают с моим файлом .htaccess.

# Compressed files
RewriteCond %{HTTP:Accept-Encoding} .*gzip.*
AddEncoding x-gzip .gz
AddType application/x-javascript .gz
AddType text/css .gz

Я называю файлы с расширением .gz уже [пример]:

<link rel="stylesheet" type="text/css" media="all" href="css/layout.css.gz" />

Итак, почему это ломается в Google Chrome?

Спасибо.


person vsync    schedule 07.06.2009    source источник


Ответы (7)


Загрузите Fiddler и просмотрите необработанные заголовки ответа, чтобы увидеть, что сервер отправляет обратно для этого конкретного запроса. .

К вашему сведению, Fiddler — это прокси-сервер на стороне клиента, который фильтрует запросы вашего браузера. Супер информативно при решении подобных вопросов.

-- Обновить

При дальнейшем расследовании не кажется, что ваш RewriteCond на самом деле делает то, что вы думаете. Согласно документации, директива RewriteCond используется только в в сочетании с RewriteRule.

person Jordan S. Jones    schedule 08.06.2009

Наш файл .htaccess (у нас есть файлы .jsz со сжатым javascript, и Chrome прекрасно их обрабатывает):

AddEncoding gzip .jsz
AddType text/javascript .jsz
person David    schedule 26.06.2009

Safari (и Google Chrome) не работает со сжатым файлом, если его расширение .gz

Для поддержки архивов gzip в Safari и Chrome скопируйте и сожмите файлы .css и .js в gzip и переименуйте их расширение .gz в .jgz (например: до — один файл style.css в каталог после — два файла, стиль .css и style.css.jgz в каталог)

И добавил этот код в ваш файл .htaccess:

AddEncoding gzip .jgz
RewriteCond %{HTTP:Accept-encoding} gzip
# RewriteCond %{HTTP_USER_AGENT} !Safari
RewriteCond %{HTTP_USER_AGENT} !Konqueror
RewriteCond %{REQUEST_FILENAME}.jgz -f
RewriteRule ^(.*)$ $1.jgz [QSA,L]

<IfModule mod_headers.c>
    Header append Vary User-Agent
    <FilesMatch .*\.js.jgz$>
    ForceType text/javascript
    Header append Vary Accept-Encoding
    Header set Content-Encoding: gzip
    Header set Cache-control: private
    </FilesMatch>
    <FilesMatch .*\.css.jgz$>
    ForceType text/css
    Header append Vary Accept-Encoding  
    Header set Content-Encoding: gzip
    Header set Cache-control: private
    </FilesMatch>
</IfModule>

Например megaburg.ru Протестировано - работает с Safari, Chrome, Opera и Firefox 8)

person Megaburg    schedule 09.04.2012

  1. Вы должны использовать заголовок ответа Content-Encoding: gzip.
  2. Вы должны возвращать сжатое содержимое GZIP, только если заголовок Accept-Encoding клиента разрешает GZIP.
person EricLaw    schedule 26.06.2009

Я ответил на аналогичный вопрос с гораздо более консервативным правилом сопоставления, когда использовать Gzip:

Safari, Chrome и IE6 имеют проблемы с загрузкой Gzip. Кроме того, Apache сделает за вас сжатие gzip, нет необходимости вручную сжимать файлы. Попробуйте этот фрагмент:

# This uses mod_deflate, which is pretty standard on Apache 2.  Loading
# mod_deflate looks like this:
#
#   LoadModule deflate_module modules/mod_deflate.so
#
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \\bMSIE !no-gzip !gzip-only-text/html

См. исходное сообщение: Как я могу сделать так, чтобы мой файл .htaccess позволял Safari и другим браузерам открывать GZIP?

person mixonic    schedule 07.08.2009
comment
я не вижу, где ваша конфигурация предотвратит использование gzip для браузера Chrome... - person HorusKol; 25.03.2010

Вам просто нужно установить поле заголовка Content-Encoding, чтобы сообщить клиенту, что данные ответа закодированы с помощью gzip:

<FilesMatch "\.gz$">
    Header set Content-Encoding gzip
</FilesMatch>

Но, к сожалению, Apache не позволяет установить это поле заголовка. Вместо этого Content-Encoding станет X-Content-Encoding.

person Gumbo    schedule 16.06.2009
comment
так что это значит, если он станет с префиксом X? - person vsync; 17.06.2009
comment
Это означает, что он не будет признан. - person Gumbo; 18.06.2009

Google Chrome (и Apple Safari) не поддерживают сжатые gzip CSS и JavaScript. Некоторые версии IE6 также имеют проблемы. Они поддерживают HTML-документы, сжатые gzip, но не CSS и JavaScript.

person elmuerte    schedule 08.06.2009
comment
как я могу отфильтровать тех, кто не поддерживает в моем файле htaccess? - person vsync; 08.06.2009
comment
Вы не должны ссылаться на файлы .gz непосредственно из вашего HTML. Вы можете использовать mod_rewrite или (еще лучше) mod_negotiation, поэтому вместо этого отправьте сжатый файл gzip. - person elmuerte; 09.06.2009
comment
или просто сжать их с помощью yui, что даст вам действительный JS и сопоставимую экономию на сжатии. - person annakata; 16.06.2009
comment
Сжатие YUI далеко не так близко к сжатию gzip. Обычно вы также сжимаете результат YUI. См.: julienlecomte.net/blog/2007/08/13. - person elmuerte; 17.06.2009
comment
да, они уже сжаты с помощью Dean's PACKER, но GZIP, безусловно, лучшее решение. мой сервер не поддерживает GZIP на лету... поэтому я должен их предварительно сжать. mod_rewrite не работает. даже если бы это было так, поможет ли это в случае с Chrome? - person vsync; 17.06.2009
comment
Я не уверен, что комментарий Chrome/Safari так точен, поскольку в настоящее время я успешно использую сжатый GZip CSS и Javascript. - person Jordan S. Jones; 19.06.2009
comment
Неправда. Текущие версии Safari и все версии Chrome прекрасно поддерживают GZIP. - person EricLaw; 26.06.2009
comment
Не для JavaScript и CSS. GZIP-документы HTML работают нормально, но когда браузер запрашивает связанные файлы javascript и css, он прекращает поддержку gzip (просто проверьте заголовки запроса, и вы увидите). - person elmuerte; 30.06.2009
comment
Это просто неправда. Все запросы JS/CSS в этих браузерах отправляются с Accept-Encoding: gzip,deflate. Возможно, у вас есть прокси/антивирус, который искажает этот заголовок запроса, чтобы упростить сканирование ваших файлов JS/CSS. Перейдите на сайт, на котором перечислены заголовки ваших запросов, и вы, вероятно, увидите такой заголовок, как Accept-Enc!ding. - person Steve Clay; 14.07.2009
comment
-1. Просто Ложь. Например, yahoo.com предоставляет сжатые таблицы стилей и файлы javascript и отлично работает в Google Chrome. Я пересмотрю свой голос, если вы докажете свою правоту (например, со ссылкой на надежный источник) - person Andrea Zilio; 24.04.2010
comment
@Andrea Zilio: это, вероятно, потому, что это было исправлено в последних версиях Chrome. Вплоть до Chrome 2.x включительно не нравились сжатые gzip файлы css/javascript. Вы никогда не должны полагаться на пользовательский агент для обслуживания файлов, сжатых gzip, всегда полагайтесь на наличие Accept-Encoding, содержащего либо gzip, либо deflate. - person elmuerte; 26.04.2010