2009-07-21 7 views
7

압축을 사용하여 CSS 파일을 포함하는 공용 PHP 파일을 만드는 CSS 파일을 gzip하는 방법에 대한 자습서가 있습니다. 문제는 그것이 내 CSS 파일을 캐시 얻을 수 없다는 것입니다. 참조 용으로 파이어 버그를 사용하고 있으며 실제로 동일한 코드를 사용하여 일부 자바 스크립트를 압축하려고했지만 캐시를 잘 캐시합니다. 캐싱 gzipped css

 
if(extension_loaded('zlib')){ 
ob_start('ob_gzhandler'); 
} 
$offset = 60 * 60 * 24 * 31; 
header('Content-type: text/css'); 
header ('Cache-Control: max-age=' . $offset . ', must-revalidate'); 
header ('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT'); 
ob_start("compress"); 
function compress($buffer) { 
    // Remove Comments, White Space, End ;'s 
    $buffer = preg_replace('#/\*.*?\*/#s', '', $buffer); 
    $buffer = preg_replace('/\s*([{}|:;,])\s+/', '$1', $buffer); 
    $buffer = preg_replace('/\s\s+(.*)/', '$1', $buffer); 
    $buffer = str_replace(';}', '}', $buffer); 
    $buffer = str_replace(' {', '{', $buffer); 
    return $buffer; 
    } 

    include('global.css'); 

    if(extension_loaded('zlib')){ 
    ob_end_flush(); 
} 

그런 다음 단순히 다른 페이지에 CSS를 문서로 내 PHP 파일을 참조하고 있습니다 : 여기

는 코드입니다. 당신이 볼 수 있듯이 믹스에 최대 나이를 추가하는 것도 실패했습니다.

여기에 응답 헤더는

 
Date  
Tue, 21 Jul 2009 19:59:19 GMT 

Server 
Apache/1.3.41 (Darwin) PHP/4.4.9 

X-Powered-By  
PHP/4.4.9 

Cache-Control 
max-age=2592000, must-revalidate 

Expires 
Thu, 20 Aug 2009 19:59:19 GMT 

Content-Encoding  
gzip 

Vary  
Accept-Encoding 

Keep-Alive 
timeout=15, max=93 

Connection 
Keep-Alive 

Transfer-Encoding 
chunked 

Content-Type  
text/css 

내가 부족 아무것도, 또는이 일에 대해 갈 수있는 더 나은 방법이 있나요입니까?

감사합니다,

편집 : 그것은 적절한 헤더와 함께이 문제를 해결했다하지 않은 경우 파일이 304 전송 & 변경되었는지 여부를 감지

스크립트.

아서

답변

7

시도 : -

$offset = 60 * 60 * 24; 
header('Content-type: text/css'); 
header('Cache-Control: max-age=' . $offset); 
header('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT'); 
header('Last-Modified: ' . gmdate ("D, d M Y H:i:s", time()) . ' GMT'); 

문제는 캐시 제어 헤더에 must-revalidate 명령했다. 이로 인해 클라이언트는 필요할 때마다 css를 다시 요청하게되고 If-Modified-Since 헤더와 304 수정되지 않은 응답 상태 코드의 전송에 대한 코드는 처리되지 않습니다.

위의 방법은 캐시 기간을 1 일로 줄이고 must-revalidate 명령을 제거합니다. 또한 Last-Modified 헤더를 추가합니다 (캐시는 Last-Modified 또는 ETag 헤더가없는 경우 캐시하지 않을 수도 있습니다).

이를 개선하기 위해 압축하는 CSS 파일의 실제 마지막 수정 시간을 찾아서 Last-Modified 헤더로 보낼 수 있습니다. If-Modified-Since 헤더와 css 파일의 값이 마지막으로 수정 된 시간을 비교하여 코드에 포함시킬 수 있습니다. 그 (것)들을 찾아내는 경우에 동일은이 우두머리의 세트를 보내고 또한 304 Unmodfied 상태를 보내고 몸을 전혀 보내지 않는다. (필자는 PHP 사용자가 아니므로 PHP 전문가에게 맡겨서 다른 대답을 제시 할 것입니다).

클라이언트가 캐시를 검색하고 검색하는 또 다른 시도를하고 그에 따라 최대 유효 기간을 설정해야하는 시간을 현실적으로 평가합니다.

+0

안녕하세요, Anthony, 나중에 변경 날짜와 행운을 함께 사용하여 제안한 것처럼 Last-Modified를 추가하려고했습니다. 이후 수정 된 ETag & If로 헤더를 보냈는데 여전히 캐시되지 않습니다 ... 답장을 보내 주셔서 감사합니다. 향후 참조 및 디버깅을 위해이 모든 내용을 명심하겠습니다. – askon

+0

@askon : 중요한 요소는 아니지만 중요한 문제는 Cache-Control 헤더에 must-revalidate 지시문을 포함시키는 것입니다. 이를 사용하면 CSS가 항상 다시 페치됩니다. 또한 테스트시 페이지 새로 고침 (F5)을 사용하고 있습니까? 그건 아무것도 증명할 수 없으며, css와 같은 리소스는 새로 고침 컨텍스트에서 다시 채워지고 코드에 내장 된 304 메커니즘없이 리소스의 전체 가져 오기가 수행됩니다. – AnthonyWJones

+0

죄송합니다. 좀 더 구체적이어야했습니다. 나는 여기에 내 헤더 응답의는 있어야 다시 검증 라인을 제거했다 : http://freetexthost.com/zqbddbchvz 내가 텍스트/자바 스크립트를 제외하고 동일한 스크립트를 시도 할 수있다 이해하지 못하는 어떤 문서 및 그것은 200 & 캐시를 보여줍니다. – askon

-1

파이썬/장고를 읽는다면, 당신은 django compressor에 대한 코드를 읽을 수 있습니다. 여러 개의 CSS 파일을 하나로 묶습니다. CSS 부분은 CSSTidy을 실행하여 CSS를 정리하는 것처럼 보입니다. 헤더의 설정이 추가

+0

2014-12-03 : 안녕하세요. @downvoter 5 년 반의 답을 들러 주셔서 감사합니다. – hughdbrown