如何为 PHP 文件启用 mod_deflate?
Posted
技术标签:
【中文标题】如何为 PHP 文件启用 mod_deflate?【英文标题】:How do I enable mod_deflate for PHP files? 【发布时间】:2011-02-19 14:51:20 【问题描述】:我有一个 Liquid Web VPS 帐户,我已确保 mod_deflate 已安装并正在运行/处于活动状态。
我曾经通过 php 压缩我的 css 和 js 文件,以及我的 PHP 文件本身...但是,我现在正尝试通过 mod_deflate 来执行此操作,它似乎对除 PHP 之外的所有文件都有效文件。 (Txt 文件可以正常工作,css、js、静态 html 文件,没有通过 PHP 文件生成。)我该如何解决这个问题?
(我使用了cPanel中“优化网站”下的“压缩所有内容”选项,它在主目录(不是public_html,比它高一级)中创建了一个.htaccess文件,其文本与“压缩”完全相同除了图像之外的所有内容”例如http://httpd.apache.org/docs/2.0/mod/mod_deflate.html)
.htaccess 文件:
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
<IfModule mod_setenvif.c>
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
</IfModule>
<IfModule mod_headers.c>
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</IfModule>
</IfModule>
【问题讨论】:
你能显示 htaccess 文件吗? 所以你压缩了两次数据? @Gumbo - 不,我从 PHP 文件中删除了压缩,现在只依赖 mod_deflate。 【参考方案1】:自从我发布这个问题以来已经有一段时间了 - 我最终通过 PHP.ini 启用 zlib 压缩,因此 zlib 压缩 PHP 输出,而 mod_deflate 压缩其他所有内容。
我认为它不起作用的原因(mod_deflate 没有压缩 PHP 输出)与 PHP 作为 CGI 而不是 Apache DSO 运行有关...
【讨论】:
您能解释一下如何在 php.ini 文件中启用 zlib 压缩吗?代码是什么?【参考方案2】:PHP 文件通常提供text/html
内容(尽管您也可以生成图像和几乎所有内容)。 PHP 文件永远不会发送到客户端:它被处理以生成内容(text/html
或图像)。
您正在寻找 gzip 压缩此内容。
【讨论】:
对。但是如果 mod_deflate 设置为压缩所有内容,那也将包括 text/html,不是吗?静态 HTML 文件(用作 text/html)正在被压缩,PHP 没有任何输出,无论是 text/html 还是其他任何内容。 @DM:您实际上是通过测试看到了这一点,还是只是假设它没有压缩? @RBemrose 看看DMred.com - css 和 js 文件被压缩,PHP 文件没有。【参考方案3】:您可以将zlib.output_compression = On
添加到您的 php.ini 配置文件中。这将压缩输出而不管 mod_deflate。
【讨论】:
是的,我知道这一点。我希望有办法让 mod_deflate 处理它......?......(zlib 在压缩之前检查浏览器是否可以接受 gzip?) 确实如此。我相信 PHP 也是如此。 在我的测试中,使用 zlib.output_compression 设置在 PHP 中进行压缩比使用 mod_deflate(或使用 gzip 模块的 nginx)在服务器中进行压缩要慢/效率低。你还有一个缺点,你仍然需要在服务器中为静态文件(例如 javascript/CSS)做这件事。【参考方案4】:整个配置方式已经过时了。现在可以而且应该删除它:Netscape 4 已经很久没有出现了,设置Vary: User-Agent
会不必要地阻碍缓存。
您需要的唯一 mod_deflate 配置是为可压缩媒体类型打开 deflate 的一行,使用 AddOutputFilter
按扩展名选择可压缩文件,或使用 AddOutputFilterByType
通过返回的 Content-Type
选择它们。
【讨论】:
将“AddOutputFilterByType DEFLATE text/html text/plain text/xml”添加到 .htaccess 的顶部没有帮助。 PHP 输出(作为文本/html 发送)仍然未压缩... AIUI 它应该被压缩。当然适用于我的 CGI 或 WSGI 输出生成 HTML。你确定其他地方没有其他配置干扰它吗? 这就是我想知道的 - 如果某处有其他配置干扰。我希望这是我的一个简单的疏忽,一些小事,但我开始认为也许不是...... @bobince,能否给我们提供配置示例。【参考方案5】:您需要将您的 mod_deflate 指令移到目录部分之外。在 httpd.conf
中为 mod_deflate
全局定义规则
【讨论】:
【参考方案6】:以防万一遇到同样问题的人在这里结束。
我在我的服务器上打开了 mod_deflate。我可以从浏览器中的响应标头中看到文本、css 和 javascript 文件正在使用 gzip 进行压缩。 Html 文件没有根据标题进行压缩。
原来这是我的病毒防护。它正在拦截传入的 HTTP 请求,如果它在响应中看到 <html>
标记,它将解压缩它并将其自己的 javascript 作为其“Web Antivirus”的一部分插入到页面中。它会从响应中剥离 gzip 标头并以未压缩的形式传递。
因此,服务器正确地 gzip 压缩了所有内容,而我的防病毒软件在它到达我之前将其解压缩。
【讨论】:
以上是关于如何为 PHP 文件启用 mod_deflate?的主要内容,如果未能解决你的问题,请参考以下文章
如何为现有应用启用 Apple 登录? “配置文件不支持使用 Apple 登录功能”
启用 mod_deflate 以发送 Content-Encoding: gzip