gpt4 book ai didi

php - 禁用 mod_deflate 和 mod_gzip 压缩 HTML、CSS 和 JS 的最佳方法

转载 作者:太空狗 更新时间:2023-10-29 13:41:33 25 4
gpt4 key购买 nike

我在运行 Apache 2 的共享主机上有几个站点。我想压缩传送到浏览器的 HTML、CSS 和 Javascript。主机已禁用 mod_deflate 和 mod_gzip,因此这些选项已失效。不过,我确实有 PHP 5,所以我可以使用它的 gzip 组件。

我目前将以下内容放入我的 .htaccess 文件中:

php_value output_handler ob_gzhandler

但是,这只压缩了 HTML 而忽略了 CSS 和 JS。

有没有一种可靠的方法可以透明地压缩 CSS 和 JS 的输出,而不必更改每个页面?我搜索了谷歌并提出了一些解决方案,但我还没有得到一个工作。如果有人可以提出他们知道可行的解决方案,我们将不胜感激。

注意,中的方法2 The Definitive Post on Gzipping your CSS 看起来是个不错的解决方案,但我无法让它工作。有没有人用这个方法成功过?

最佳答案

抱歉延迟了 - 这对我来说是忙碌的一周。

假设:

  • .htaccesscompress.php
  • 在同一个文件中
  • 要压缩的静态文件在static子目录下

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

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

要求您的提供商允许您覆盖 .htaccess 文件中的 mod_rewrite 选项。然后 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);

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

至于确保脚本的安全——我将文件系统中的真实路径转换为真实路径,这样就不会通过黑客入侵的“../../../etc/passwd”或其他 shellscript 文件路径。

就是这样

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

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

我还会检查生成的路径是否在脚本的目录树中。按照 pilif 的建议添加用于缓存控制的 header ,您应该有一个解决问题的有效方法。

关于php - 禁用 mod_deflate 和 mod_gzip 压缩 HTML、CSS 和 JS 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com