Apache/2.2.20 (Ubuntu 11.10) сжатие gzip не будет работать на страницах php, содержимое разбито на части
У меня проблема с новым рабочим сервером, на который я переношу проекты. HTML-вывод PHP-приложений не сжимается модулем Apache mod_deflate. Другие ресурсы, такие как таблицы стилей и файлы javascript, даже html-страницы, которые обслуживаются тем же типом контента (text / html), что и выходные данные PHP, сжимаются!
Проекты используют следующие правила (из шаблона HTML5) в.htaccess:
# Force deflate для искаженных заголовков developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/ SetEnvIfNoCase ^ (Accept-EncodXng | X-cept-Encoding | X {15} | ~ {15} | - {15}) $ ^ ((gzip | deflate) \ s *,? \ S *)+|[X~-]{4,13}$ HAVE_Accept-Encoding RequestHeader добавить Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding IfModule> IfModule> # HTML, TXT, CSS, JavaScript, JSON, XML, HTC: FilterDeclare COMPRESS FilterProvider COMPRESS DEFLATE resp = Тип содержимого $text/html FilterProvider COMPRESS DEFLATE resp= Тип содержимого $text/css FilterProvider COMPRESS DEFLATE resp=Content-Type $text/plain FilterProvider COMPRESS DEFLATE resp= Тип содержимого $text/xml FilterProvider COMPRESS DEFLATE resp=Content-Type $text/x-component FilterProvider COMPRESS DEFLATE resp= Тип содержимого $application/javascript FilterProvider COMPRESS DEFLATE resp= Тип содержимого $application/json FilterProvider COMPRESS DEFLATE resp= Тип содержимого $application/xml FilterProvider COMPRESS DEFLATE resp= Тип содержимого $application/xhtml+xml FilterProvider COMPRESS DEFLATE resp= Тип содержимого $application/rss+xml FilterProvider COMPRESS DEFLATE resp= Тип содержимого $application/atom+xml FilterProvider COMPRESS DEFLATE resp= Тип содержимого $application/vnd.ms-fontobject FilterProvider COMPRESS DEFLATE resp= Тип содержимого $image/svg+xml FilterProvider COMPRESS DEFLATE resp= Тип содержимого $image/x-icon FilterProvider COMPRESS DEFLATE resp= Тип содержимого $application/x-font-ttf FilterProvider COMPRESS DEFLATE resp=Content-Type $font/opentype FilterChain COMPRESS FilterProtocol COMPRESS DEFLATE изменить = да; байтов = нет IfModule> IfModule>
У нас есть тестовая машина, которая работает с той же версией Apache, OS и PHP. На этой машине сжатие прекрасно работает на выходе PHP. Насколько я могу судить, я проверил и сравнил конфигурационные файлы Apache и PHP.
Я пробовал несколько способов вывода содержимого PHP, используя буферизацию вывода или просто отображая содержимое. То же самое, без сжатия.
Пример заголовка ответа вывода PHP:
HTTP / 1.1 200 ОК Дата: среда, 25 апреля 2012 г. 23:30:59 по Гринвичу Сервер: Apache Accept-Ranges: байты Истекает: четверг, 19 ноября 1981 года, 08:52:00 по Гринвичу Cache-Control: общедоступный Прагма: без кеша Варь: Пользователь-агент Keep-Alive: тайм-аут =5, максимум =98 Подключение: Keep-Alive Передача-кодировка: чанки Content-Type: text/html; кодировка = UTF-8
Пример заголовка ответа в файле CSS:
HTTP / 1.1 200 ОК Дата: среда, 25 апреля 2012 г. 23:30:59 по Гринвичу Сервер: Apache Дата последнего изменения: понедельник, 04 июля 2011 19:12:36 GMT Варьируется: Accept-Encoding,User-Agent Контент-кодировка: gzip Cache-Control: общедоступный Истекает: пт, 25 мая 2012 23:30:59 GMT Контент-длина: 714 Keep-Alive: тайм-аут =5, максимум =100 Подключение: Keep-Alive Тип контента: текст / CSS; кодировка = UTF-8
У кого-нибудь есть подсказка или опытная такая же "проблема"?
Спасибо!
2 ответа
Если Apache не может определить, насколько велик возвращаемый контент, он автоматически прибегнет к кусочному кодированию. В зависимости от того, как выполняется ваш PHP-скрипт (CGI, FastCGI и т. Д.), Apache может не знать размер контента, когда он начинает возвращать его пользователю. То есть, если он выводит содержимое по всему сценарию, он может немедленно записать эти данные в буфер клиента.
Причина, по которой он работает со статическими файлами, заключается в том, что Apache знает их размер, когда начинает возвращать его. Это может указывать на проблему с вашей конфигурацией Apache/PHP (т. Е. Она начинает записывать момент, когда выходные данные возвращаются из скрипта), или из-за того, как работает ваш скрипт.
Другими словами, это звучит как проблема с PHP или вашим коннектором Apache/PHP, а не с mod_deflate
,
Пожалуйста, проверьте, включено ли сжатие вывода PHP. Это можно сделать в файле php.ini или с помощью директивы времени выполнения. Проверьте документацию для более подробной информации.