如何为 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 请求,如果它在响应中看到 &lt;html&gt; 标记,它将解压缩它并将其自己的 javascript 作为其“Web Antivirus”的一部分插入到页面中。它会从响应中剥离 gzip 标头并以未压缩的形式传递。

因此,服务器正确地 gzip 压缩了所有内容,而我的防病毒软件在它到达我之前将其解压缩。

【讨论】:

以上是关于如何为 PHP 文件启用 mod_deflate?的主要内容,如果未能解决你的问题,请参考以下文章

如何为特定目录或文件启用特定 gcc 警告? [复制]

httpd之mod_deflate模块的使用

如何为现有应用启用 Apple 登录? “配置文件不支持使用 Apple 登录功能”

启用 mod_deflate 以发送 Content-Encoding: gzip

在 Sublime Text 3 中,如何为 JSX 文件启用 Emmet?

Apache网页优化和安全优化