У меня проблема с новым производственным сервером, на который я передаю проекты. 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 или с помощью директивы времени выполнения. Проверьте документация Больше подробностей.