禁用mod_deflate和mod_gzip压缩HTML,CSS和JS的最佳方法

Cha*_*per 8 html php compression apache

我在运行Apache 2的共享主机上有几个站点.我想压缩传递给浏览器的HTML,CSS和Javascript.主机已禁用mod_deflate和mod_gzip,因此这些选项已经用完.不过我可以使用PHP 5,所以我可以使用gzip组件.

我目前在.htaccess文件中放置以下内容:

php_value output_handler ob_gzhandler

但是,这只会压缩HTML并省略CSS和JS.

是否有一种可靠的方法透明地压缩CSS和JS的输出而无需更改每一页?我搜索过谷歌并提供了一些解决方案,但我还没有找到一个解决方案.如果有人可以建议他们知道可以工作的解决方案,那将非常感激地收到.

注意,关于Gzipping你的CSS的权威帖子方法2看起来是一个很好的解决方案,但我无法让它工作.有没有其他人成功使用这种方法?

mac*_*die 7

对于延迟感到抱歉 - 这对我来说是忙碌的一周.

假设:

  • .htaccess 与...相同的文件 compress.php
  • 要压缩的静态文件位于static子目录中

我通过在.htaccess中设置以下指令开始我的解决方案:

RewriteEngine on
RewriteRule ^static/.+\.(js|ico|gif|jpg|jpeg|png|css|swf)$ compress.php [NC]
Run Code Online (Sandbox Code Playgroud)

您的提供商必须允许您覆盖文件中的mod_rewrite选项.htaccess.然后compress.php文件本身可能如下所示:

<?php

$basedir = realpath( dirname($_SERVER['SCRIPT_FILENAME']) );
$file = realpath( $basedir . $_SERVER["REQUEST_URI"] );

if( !file_exists($file) && strpos($file, $basedir) === 0 ) {
    header("HTTP/1.0 404 Not Found");
    print "File does not exist.";
    exit();
}

$components = split('\.', basename($file));
$extension = strtolower( array_pop($components) );

switch($extension)
{
    case 'css':
        $mime = "text/css";
        break;
    default:
        $mime = "text/plain";
}

header( "Content-Type: " . $mime );
readfile($file);
Run Code Online (Sandbox Code Playgroud)

您当然应该在switch语句中添加更多mime类型.我不想让解决方案依赖于PECL fileinfo扩展或任何其他神奇的MIME类型检测库-这是最简单的方法.

至于固定脚本 - 我在文件系统中做翻译的真实路径所以没有破解"../../../etc/passwd"或其他shell脚本文件路径不通过.

那就是

$basedir = realpath( dirname($_SERVER['SCRIPT_FILENAME']) );
$file = realpath( $basedir . $_SERVER["REQUEST_URI"] );
Run Code Online (Sandbox Code Playgroud)

片段.虽然我很确定除了$ basedir之外的其他层次结构中的大多数路径都会在Apache到达脚本之前由Apache处理.

另外,我检查结果路径是否在脚本的目录树中.像pilif建议的那样添加缓存控制的标题,你应该有一个解决问题的工作方案.


mac*_*die 1

您可以使用mod_rewrite试试运气。

创建一个脚本,通过eg 将本地静态文件名作为输入,$_SERVER['QUERY_STRING']并以压缩形式输出。许多提供商不允许mod_rewrite使用.htaccess文件进行配置或将其完全禁用。

如果您以前没有使用过重写,我推荐一本很好的初学者指南,比如这个。这样你就可以让 apache 将所有对静态文件的请求重定向到 php 脚本。例如,style.css 将被重定向到compress.php?style.css 。

一如既往,对您接受的输入要极其XSS谨慎,否则您就会被利用!