【问题标题】:GZIP CSS completely breaks pageGZIP CSS 完全打破页面
【发布时间】:2012-09-02 02:31:09
【问题描述】:

感谢您的光临。我真的自己尝试过,但又一次觉得我无法处理。

情况...


我在共享主机上使用自己的网站。当我想要压缩我的大量 cms 生成的 js 和 css 以使 PageSpeedInsights 和我自己开心时,我阅读了它,最后发现 我的主机既没有安装 mod_gzip 也没有安装 mod_deflate 。安装的是ZLIB。所以我搜索了一下。找到了典型的 php append 解决方案并且不喜欢它。为 htaccess 找到了几行简洁的代码,这让我很高兴,因为它们可以立即工作:
AddHandler application/x-httpd-php .html .htm .php .js
php_flag output_buffering On
php_value output_handler ob_gzhandler
php_flag zlib.output_compression Off

我通过使用GIDZipTest 确认它正在工作。这一切都很好,我喜欢它。

但是,一旦我将 .css 放入 AddHandler 列表,我的页面就完全崩溃了。
我尝试使用 @987654322 @ 仅适用于 css 文件,但它最终根本不起作用。什么都不做。


解决方法? (不是真的)


我手动缩小了所有 css 并上传了每个文件的 css.gz 版本,并提供给它
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.css $1\.css\.gz [QSA]
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]

这也很好用。


问题!


  1. 我需要定义/指定什么才能使 css 压缩工作?我觉得我只是缺少一些转换的东西......

  2. 当我将手动缩小的 .css.gz 文件提供给客户端时,它们是否仍会被额外压缩?

  3. 这在文件大小方面是否有任何进一步的优势,还是我应该坚持使用手动提供的版本并给出关于 Google PageSpeed 的 **?
    (即使对于缩小版,GIDZipTest 仍会显示“假设”场景文件,老实说,这些数字令人印象深刻。我希望...)

提前感谢您的任何评论。
此致

玛丽安

【问题讨论】:

    标签: css .htaccess compression gzip zlib


    【解决方案1】:

    PHP+zlib 解决方案自动压缩从网络服务器提供的每个 PHP 文件。这意味着您放入 php 处理程序的每个文件都将被压缩发送到客户端浏览器。无论如何, AddHandler 指令告诉网络服务器将 css 文件作为 php 脚本处理,这就是为什么我认为它们被“损坏”了。 Css 文件应该有自己的处理程序(text/css)。

    另一个(未测试)解决方案可能是保留您最初定义的处理程序:

    AddHandler application/x-httpd-php .html .htm .php .js .css
    

    并在您的 css 文件顶部添加此 php 代码:

    <?php header('Content-Type: text/css'); ?>
    

    但我不确定这是否可行。这应该告诉浏览器他们实际上正在接收 css 文件。

    在这些情况下,最好的解决方案是您提到的 mod_deflate。

    【讨论】:

    • 试过这个。使用:&lt;?php header ("content-type: text/css; charset: UTF-8");?&gt; 创建了一个文件“gzip-css.php”,然后在 htaccess 中使用 &lt;filesMatch "\.(css)$"&gt; php_value auto_prepend_file gzip-css.php &lt;/filesMatch&gt; 在文件前面添加。以同样的方式破碎。我很想放气,但 mod_deflate 没有安装。或者我可以在 zlib 中使用 deflate 吗?如果是这样,怎么做?我已经尝试过AddOutputFilterByType DEFLATE text/css,但什么也没发生。
    • 好吧,我的意思是创建一个带有初始 php 代码的 .css 扩展文件,而不需要任何额外的 htaccess 指令(看这里:webmasterworld.com/apache/3942763.htm),而不是带有 .php 扩展名的 css 文件,但也许这个解决方案也不起作用。我知道没有安装mod_deflate,那你恐怕没有太多选择了。
    • 向使用 AddHandler 压缩的 css 文件添加内容类型标头奇怪的是不起作用,尽管在同一脚本中使用 ob_gzhandler 可以。 (查看我自己的解决方案)感谢您的建议!
    【解决方案2】:

    您提供压缩的内容,但不只是用于传输,这将通过Content-Encoding 完成。所以客户端在解释内容之前不会解压。

    您可以启用MultiViews 以允许自动content negotiation with mod_negotiation

    <FilesMatch "\.css$">
        Options MultiViews
    </FilesMatch>
    

    【讨论】:

    • 遗憾的是,仅将其添加到 .htaccess 中也没有用,尽管它看起来很有希望。 ;_;尝试了 zlib 和手动服务的各种组合。有需要注意的顺序吗?
    • @Marian 不,这应该按原样工作。也许您需要添加AddEncoding x-gzip .gz .tgz
    【解决方案3】:

    因此,如果您遇到类似问题,我建议您阅读this article 并正确获取您的full web directory path

    创建一个php脚本(例如:“gzip-css.php”)
    <?php
    ob_start("ob_gzhandler");
    header("content-type: text/css; charset: UTF-8");
    ?>
    

    并在前面加上 .htaccess

    <FilesMatch "\.css$">
    ForceType application/x-httpd-php
    php_value auto_prepend_file "/full/path/to/that/file/see/link/above/gzip-css.php"
    </FilesMatch>
    

    到所有 .css 文件。到目前为止,这似乎是我唯一的解决方案。如果我之前找到了完整的路径,我会在不问这里的情况下做到这一点。也许有人对如何将 AddHandler 版本与 css 结合起来有更好的想法。

    不起作用的东西(完全禁用所有 css):
    - 将 .css 添加到 AddHandler 和上述任何(包括我的)解决方案中。
    - 提供手动 gzip 压缩的 css 文件并预先添加内容类型脚本
    - 两者结合

    【讨论】:

      【解决方案4】:

      老问题,但我找到了一个对我有用的 .htaccess 解决方案,无需修改任何代码。

      AddHandler application/x-httpd-php .html .htm .php .js .css
      <Files *.css>
          Header set Content-type "text/css"
      </Files>
      php_flag zlib.output_compression On
      php_value zlib.output_compression_level 5
      

      【讨论】:

        猜你喜欢
        • 2012-12-28
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多