【问题标题】:How do I enable mod_deflate for PHP files?如何为 PHP 文件启用 mod_deflate?
【发布时间】: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。

标签: php .htaccess gzip httpd.conf 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 压缩了所有内容,而我的防病毒软件在它到达我之前将其解压缩。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2010-09-09
      相关资源
      最近更新 更多