지금은 mod_gzip
또는 mod_deflate
을 사용 가능하게하지 않는 서버에서 CSS 및 JS 파일을 제공하려고합니다. 그래서 저는 GZIP로 압축하고 사용자에게 돌아가는 작은 PHP 스크립트를 작성했습니다.gzipped 파일의 Content-Length를 결정하는 방법은 무엇입니까?
예제 코드 : 내가 지금이 문제가 발생
$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();
. 첫 번째는 브라우저에 content-length를 알리기 위해 압축 된 파일의 크기를 결정하는 데 문제가 있습니다. 내가 할 경우 더 많은 데이터를 기다리는 동안, 브라우저가 응답,
header("Content-Length: ".$info["size"]);
하지만 : 일반적으로,이 라인을 포함한다. 총 크기를 계산하는 방법이 있습니까? 아니면이 헤더 지시어를 무시해야합니까?
다른 문제는 Firefox에서이 PHP 파일을 볼 때마다 결과를 다운로드하도록 시도한다는 것입니다. 크롬에서는 예상대로 표시합니다. 어떤 제안?
편집 :
header("Content-Encoding: gzip");
$compressed = gzencode(file_get_contents($filename), 5);
header("Content-Length: ".strlen($compressed));
die($compressed);
이는 내용 길이 위대한 작품 : 비누 상자에 덕분에, 나는이와 코드의 끝을 교체! 하지만 여전히 파일을 다운로드하는 대신 Firefox에서 파일을 다운로드하도록하고 있습니다. :(다시
편집 : 여기 수정 된 최종의 코드 코드, 클리 터스의 예의입니다 나는 파이어 폭스하려고 계속 이유를 알아 내기 위해 새로운 질문을 시작하겠습니다
// 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();
.
답변에 언급 된 헤더 중 몇 가지 오류가 있습니다. 이중 Cache-Control, Cache-Control : Expires ...와 같은 줄은 Expires : ...이어야하며 ETag는 ETag 여야합니다. –