Назад | Перейти на главную страницу

Apache / 2.2.20 (Ubuntu 11.10) сжатие gzip не будет работать на страницах php, содержимое разбито

У меня проблема с новым производственным сервером, на который я передаю проекты. HTML-вывод приложений PHP не сжимается модулем Apache mod_deflate. Другие ресурсы, такие как файлы стилей и javascript, даже страницы html, которые обслуживаются с тем же типом содержимого (text / html), что и вывод PHP, сжимаются!

В проектах используются следующие правила (из шаблона HTML5) в .htaccess:

<IfModule mod_deflate.c>
  # Force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
  <IfModule mod_setenvif.c>
    <IfModule mod_headers.c>
      SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
      RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
    </IfModule>
  </IfModule>

  # 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 $image/x-icon
    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>                                                                                                                                                                 

У нас есть тестовая машина, на которой работает та же версия Apache, ОС и PHP. На этой машине сжатие отлично работает на выходе PHP. Я проверил и сравнил файлы конфигурации Apache и PHP, насколько я могу судить, все одинаково.

Я пробовал несколько способов вывода содержимого PHP, используя буферизацию вывода или просто повторяя содержимое. То же самое, без сжатия.

Пример заголовков ответа вывода PHP:

HTTP/1.1 200 OK
Date: Wed, 25 Apr 2012 23:30:59 GMT
Server: Apache
Accept-Ranges: bytes
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: public
Pragma: no-cache
Vary: User-Agent
Keep-Alive: timeout=5, max=98
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8

Пример заголовков ответа в файле css:

HTTP/1.1 200 OK
Date: Wed, 25 Apr 2012 23:30:59 GMT
Server: Apache
Last-Modified: Mon, 04 Jul 2011 19:12:36 GMT
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Cache-Control: public
Expires: Fri, 25 May 2012 23:30:59 GMT
Content-Length: 714
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/css; charset=utf-8

Кто-нибудь знает или испытывал ту же "проблему"?

Спасибо!

Если Apache не может определить размер возвращаемого содержимого, он автоматически переходить к фрагментированному кодированию. В зависимости от того, как выполняется ваш PHP-скрипт (CGI, FastCGI и т. Д.), Apache может не знать размер содержимого, когда он начинает возвращать его пользователю. То есть, если у вас есть вывод содержимого на протяжении всего скрипта, он может немедленно записать эти данные в буфер клиента.

Причина, по которой он работает со статическими файлами, заключается в том, что Apache знает их размер, когда начинает его возвращать. Это может указывать на проблему с вашей конфигурацией Apache / PHP (т.е. он начинает писать в тот момент, когда из сценария возвращаются выходные данные) или на то, как работает ваш сценарий.

Другими словами, это похоже на проблему с PHP или вашим коннектором Apache / PHP, а не с mod_deflate.

Пожалуйста, проверьте, включено ли сжатие вывода PHP. Это можно сделать в файле php.ini или с помощью директивы времени выполнения. Проверьте документация Больше подробностей.