St.*_*son 13 php gzip header http-headers
现在我正试图从服务器上提供CSS和JS文件,这些服务器不允许我启用mod_gzip或mod_deflate.所以我写了一个小的PHP脚本来压缩GZIP并返回给用户.
示例代码:
$filename = "style.css";
if (!file_exists($filename) || !($info = stat($filename))) {
header("HTTP/1.1 404 Not Found");
die();
}
header("Date: ".gmdate("D, j M Y H:i:s e", time()));
header("Cache-Control: max-age=2592000");
header("Last-Modified: ".gmdate("D, j M Y H:i:s e", $info['mtime']));
header("Etag: ".sprintf("\"%x-%x-%x\"", $info['ino'], $info['size'], $info['mtime']));
header("Accept-Ranges: bytes");
header("Cache-Control: Expires ".gmdate("D, j M Y H:i:s e", $info['mtime']+2592000));
header("Content-Type: text/html");
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
Run Code Online (Sandbox Code Playgroud)
我现在有两个问题.首先,我无法确定压缩文件的结果大小,以通知浏览器内容长度.通常,我会包括这一行:
header("Content-Length: ".$info["size"]);
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做,浏览器会在尝试等待更多数据时挂起.有没有办法计算总大小?或者我应该忽略这个头指令.
另一个问题是,每当我在Firefox中查看此PHP文件时,它都会尝试让我下载结果.在Chrome中,它只是像我期望的那样显示它.有什么建议?
编辑:感谢SoapBox,我用这个替换了代码的结尾:
header("Content-Encoding: gzip");
$compressed = gzencode(file_get_contents($filename), 5);
header("Content-Length: ".strlen($compressed));
die($compressed);
Run Code Online (Sandbox Code Playgroud)
这适用于内容长度!但我仍然让Firefox下载文件而不是显示它.:(
再次编辑:这是修改后的代码结束代码,由Cletus提供.
// Start buffered output
ob_start();
// Check for gzip capability
if (stripos($_SERVER['HTTP_ACCEPT_ENCODING'], "gzip") !== false) {
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
} else
echo file_get_contents($filename);
// Write the content length
header('Content-Length: '.ob_get_length());
ob_end_flush();
Run Code Online (Sandbox Code Playgroud)
我将开始一个新的问题来弄清楚为什么Firefox一直试图下载该文件.
cle*_*tus 19
这里的问题是要知道内容长度,您需要知道客户端是否支持gzip编码,并且您已使用ob_gzhandler委派了该决策.来自HTTP标头:
Run Code Online (Sandbox Code Playgroud)ob_start(); ob_start('ob_gzhandler'); ... output the page content... ob_end_flush(); // The ob_gzhandler one header('Content-Length: '.ob_get_length()); ob_end_flush(); // The main one
完整版:
$filename = "style.css";
if (!file_exists($filename) || !($info = stat($filename))) {
header("HTTP/1.1 404 Not Found");
die();
}
header("Date: ".gmdate("D, j M Y H:i:s e", time()));
header("Cache-Control: max-age=2592000");
header("Last-Modified: ".gmdate("D, j M Y H:i:s e", $info['mtime']));
header("ETag: ".sprintf("\"%x-%x-%x\"", $info['ino'], $info['size'], $info['mtime']));
header("Accept-Ranges: bytes");
header("Expires: ".gmdate("D, j M Y H:i:s e", $info['mtime']+2592000));
header("Content-Type: text/css"); // note: this was text/html for some reason?
ob_start();
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
header('Content-Length: '.ob_get_length());
ob_end_flush();
Run Code Online (Sandbox Code Playgroud)
这比自己承担gzip编码问题要好得多.