Fam*_*ive 5 php compression deflate apache-2.2
我正在将项目转移到新生产服务器时遇到问题。PHP 应用程序的 HTML 输出没有被 Apache mod_deflate 模块压缩。其他资源,如样式表和 javascript 文件,甚至与 PHP 输出具有相同内容类型 (text/html) 的 html 页面,都被压缩了!
项目在 .htaccess 中使用以下规则(来自 HTML5 样板):
<IfModule mod_deflate.c> # 对损坏的标头强制放气 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 附加 Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding </IfModule> </IfModule> # HTML、TXT、CSS、JavaScript、JSON、XML、HTC: <IfModule filter_module> 过滤声明压缩 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 过滤链压缩 FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no </IfModule> </IfModule>
我们有一台运行相同 Apache、OS 和 PHP 版本的测试机。在那台机器上,压缩在 PHP 输出上工作得很好。据我所知,我已经检查并比较了 Apache 和 PHP 配置文件。
我尝试了几种输出 PHP 内容的方式,使用输出缓冲或只是简单地回显内容。同样的事情,没有压缩。
PHP 输出的示例响应标头:
HTTP/1.1 200 正常 日期:2012 年 4 月 25 日,星期三 23:30:59 GMT 服务器:阿帕奇 接受范围:字节 到期:1981 年 11 月 19 日星期四 08:52:00 GMT 缓存控制:公共 编译指示:无缓存 变化:用户代理 保持活动:超时=5,最大=98 连接:保持活动 传输编码:分块 内容类型:文本/html;字符集=utf-8
css 文件上的响应头示例:
HTTP/1.1 200 正常 日期:2012 年 4 月 25 日,星期三 23:30:59 GMT 服务器:阿帕奇 上次修改时间:2011 年 7 月 4 日星期一 19:12:36 GMT 变化:接受编码,用户代理 内容编码:gzip 缓存控制:公共 到期: 2012 年 5 月 25 日星期五 23:30:59 GMT 内容长度:714 保持活动:超时=5,最大值=100 连接:保持活动 内容类型:文本/css;字符集=utf-8
有没有人有线索或经历过同样的“问题”?
谢谢!
如果 Apache 无法判断返回的内容有多大,它会自动采用分块编码。根据 PHP 脚本的运行方式(CGI、FastCGI 等),Apache 在开始将内容返回给用户时可能不知道内容的大小。即,如果您让它在整个脚本中输出内容,它可能会立即将该数据写入客户端的缓冲区。
它处理静态文件的原因是因为 Apache 在开始返回静态文件时知道它们的大小。这可能表明您的 Apache/PHP 配置存在问题(即,它在从脚本返回输出时开始写入),或者表明您的脚本本身的工作方式存在问题。
换句话说,这听起来像是 PHP 或 Apache/PHP 连接器的问题,而不是mod_deflate
.
归档时间: |
|
查看次数: |
1492 次 |
最近记录: |