2010-03-07 2 views
7

내 CSS 파일은 콘텐츠 유형 text/css과 함께 제공되는 PHP 파일이므로 해당 파일에서 PHP 변수를 사용할 수 있습니다. style.php은 다음과 같습니다동적 CSS (PHP를 통해 생성) 용 캐시 헤더

<?php 
header('Content-Type: text/css'); 
$bgColor = '#000'; 
?> 

body { background:<?php print $bgColor; ?>; } 

예상대로 작동하지만, 브라우저가 동적으로 생성 된 CSS 파일을 캐시 만약 내가 조금 걱정입니다.

firebug에서 요청을 볼 때 페이지를 새로 고침 할 때마다 브라우저가 새로로드 될 것 같습니다. style.php

이미 이러한 캐시 헤더를 추가하려고 :

header('Cache-control: must-revalidate'); 
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 60 * 60 * 24) . ' GMT'); 

하지만 행운을. 페이지가로드 될 때마다 파일이 계속로드됩니다. 브라우저가 특정 시간 동안 파일을 캐시하도록하려면 적절한 헤더는 무엇입니까? 당신이 파일을 브라우저 캐시하려는 경우, 당신은 대중에게 Cache-Control 헤더를 설정해야합니다

답변

2

:

header('Cache-control: public'); 

해야-재 검증은 파일이 업데이트되었는지 브라우저가 확인된다는 것을 의미합니다 , 귀하의 PHP 스크립트를 호출합니다.

+5

는 HTTP/1.1 사양에 따르면, 그-검증이 있어야합니다 뜻 무엇 아니다 - 캐시 된 내용이 부실해질 후이 만료의 지시에 따라이 단지 (킥하기로했다 헤더 또는 Cache-Control 내의 최대 사용 기간 값)을 사용하지만 일부 브라우저는 사양을 무시하고 요청을 보내는 것으로 보입니다. 연결이 인증되지 않는 한 '공개'는 실제로 적용 할 수 없습니다. Expires 헤더의 시간을 강화하기 위해 'Cache-Control : max-age = 86400'을 사용합니다. –

+0

@Brock Batsell : 댓글 주셔서 감사합니다! 그걸 명확히하고 최대 작동 = XXXX – Max

+0

파일 내용이 변경되면 요청한 파일이 업데이트되지 않습니다. OP는 콘텐츠가 변경된 경우 파일을 캐시해서는 안됩니다. 파일 내용이 변경되지 않은 경우 캐싱해야합니다. 제공 한 코드가 "캐싱"기능을 사용합니다. 그것은 OP 문제를 해결하지 못합니다. –

1

이 코드는 문제를 해결합니다.

"마지막으로 수정 된"변수를 확인하고 파일에 대한 e 태그를 지정합니다. eTag가 수정 된 경우 (또는 파일이 수정 된 경우) 파일이 표시됩니다. 그렇지 않으면 페이지가 수정되지 않았다는 304 HTTP 오류가 있습니다.

eTag는 실제로 당신이 찾고있는 것입니다.

코드 :

<?php 
// Custom variables 
$variables = array('#CCC','#800'); // from db 

// CSS Content 
header('Content-type: text/css'); 

// Last Modified 
$lastModified = filemtime(__FILE__); 

// Get a unique hash of this file (etag) 
$etagFile = md5_file(__FILE__); 

// Get the HTTP_IF_MODIFIED_SINCE header if set 
$ifModifiedSince = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false); 

// Get the HTTP_IF_NONE_MATCH header if set (etag: unique file hash) 
$etagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false); 

// Set last-modified header 
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT"); 

// Set etag-header 
header("Etag: $etagFile"); 

// Make sure caching is turned on 
header('Cache-Control: public'); 

// Check if page has changed. If not, send 304 and exit 
if(@strtotime($ifModifiedSince) == $lastModified || $etagHeader == $etagFile){ 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
} 
?> 
body {background: <?php echo $variables[0]; ?>;}