2009-12-19 5 views
2

PHP를 사용하여 정적 Javascript 및 CSS 파일을 gzipping하고 있습니다. 원본 파일이 요청되면 서버는 Last-ModifiedETag 헤더를 보냅니다. 나는 아직 PHP로 이것을 보내지 않을 것이다. 또한 Cache-controlExpires 헤더를 사용하고 내가 기억하지 못하는 몇 가지 제안을 보았습니다.정적 콘텐츠를 제공하는 데 사용해야하는 헤더는 무엇입니까?

처음 두 개이면 충분합니까? PHP로 마지막 수정 날짜를 쉽게 얻을 수 있다고 생각합니다. 그러나 어떻게 ETag를 생성합니까?

다른 두 개를 포함하는 것이 더 좋으면 이미지와 같은 다른 파일에 첨부하는 가장 좋은 방법은 무엇입니까? 어쩌면 .htaccess을 통해? (나는 서버에 직접 액세스 할 수 없습니다.) ETag의 경우

+2

정적 인 PHP를 gzipping하는 이유는 무엇입니까? 한 번 gzip을 사용하지 않고 왜 아파치를 제공해야합니까? 또는 mod_deflate를 사용하십시오 ... – mopoke

+0

1) 모든 브라우저가 gzipping (올바르게)을 지원하지 않기 때문에 2) 누가 추가 빌드/배포 단계를 원하십니까? – cletus

+0

'.htaccess' 파일에서 gzip/압축 해제 할 파일을 지정할 수 있습니까? 그게 더 빠를까요? – DisgruntledGoat

답변

1

어떤 값을 사용할 수 있지만 현재 파일 [m]의 md5_file() sha1_file()을 고유 식별자로 사용하는 것을 선호합니다. 내용 (실제로 많은 충돌이 없어야 함).

출력 전에 수행하십시오.

<?php header("Etag: " . sha1_file(basename($_SERVER[ 'PHP_SELF' ]))); ?> 

하거나 (활성화 된 경우 대개 인) htaccess로에 당신을 위해 그것을 할 아파치를 할 수 있습니다 (이

# if we're clustered this will still be cool 
FileETag MTime Size 

그리고 당신은 설정하려면 오랜 기간이 만료)하지만 약간 위험하다, 당신은 또한이 작업을 수행 할 수 있습니다

# turn on far-future expiration dates 
# to cache content longer (30 days) 
ExpiresActive On 
ExpiresDefault A2592000 

을하지만 조심해야 해, 당신은 당신이 때마다이 파일을 업데이트을 변경해야 할 파일()의 버전을 확인해야합니다.

+0

이미지 전용으로이 작업을 수행 할 수 있습니까? ""지시어를 사용하고 있을까요? 그리고 어떻게'A2592000' 코드를 생성합니까? – DisgruntledGoat

+0

이 작업은 이미지에만 적용 할 수 있으며, apache 명령 ExpiresByType을 찾아 볼 수 있습니다 (예 : image/jpeg 등). 따라서 mime 파일의 모든 유형 (일반적으로 image/png, image/gif, image/jpeg)을이 항목으로 설정할 수 있습니다. 명령에서도이 작업을 수행 할 수 있지만, 유형에 따라 나에게 더 나은 솔루션 (PHP 이미지를 사용하면 어떨까요?)과 같게 보입니다. A2592000은 30 일 동안의 초의 숫자입니다. (수학을하거나 신뢰 해주세요 : P) –

+0

숫자가 2592000인데 OK가 앞에 오나요? 유닛이나 무언가를 지정합니까? – DisgruntledGoat

1

참조 :

은 기본적으로 당신이 원하는에 :

  • 당신이 (등, 스프라이트, 그들을 결합을 통해) 보낼 파일의 수를 최소화;
  • 모든 자바 스크립트 파일을 축소하십시오.
  • GZip 모든 것 (올바르게 지원하는 브라우저); 및
  • 모든 버전. I를 버전으로

대신의 의미 :

<img src="/images/logo.gif"> 

파일의 mtime에 같은 "버전"표시하기 위해 뭔가를 추가

<img src="/images/logo.gif?1234568899"> 

는 먼 미래에이 결합을 Expires 헤더 브라우저는 파일을 한 번만 요청합니다. 그런 다음 브라우저에서 새 사본을 얻으려면 버전 번호를 변경하십시오.

IMHO 이것은 ETags 등을 포함하는 방법보다 훨씬 우수합니다.

+0

팁 주셔서 감사합니다. 현재 날짜 이후 몇 개월 동안 만료 헤더를 자동으로 설정하는 방법이 있습니까? htaccess에서'Header set Expires "Thu, 2010 년 4 월 15 일 20:00:00 GMT를 할 수있는 것처럼 보이지만, 그 날이 가까워지면 나는 몇 달 앞으로 다시 놓아야 할 것입니다 ... – DisgruntledGoat

0

Apache는 inode-size-timestamp를 Etag로 사용하지만 웹 서버 클러스터가있는 경우에는 작동하지 않습니다. 이 경우 url-size-timestamp의 md5를 사용할 수 있습니다. More info in the Etag section here

대용량 파일 (예 : 이미지, 오디오, 비디오)이 비싸기 때문에 전체 파일의 md5를 계산하지 않는 것이 좋습니다.

0

왜 정적 요청을 제공하기 위해 Apache를 직접 사용하지 않습니까?

헤더를 올바르게 압축 할뿐만 아니라 물건을 압축하고 가장자리 케이스도 처리 할 수 ​​있습니다.

조건부 요청을 올바르게 처리하는 것은 분명하지 않으며 사용자가 시도해야한다고 생각하지 않습니다. 이미 수행 한 웹 서버를 사용하십시오.

그렇다고 모든 기본값이 의미있는 것은 아닙니다. 사이트에 둘 이상의 웹 서버가 있고 드물게 변경되는 내용에 "Expires"헤더를 설정하면 클라이언트의 캐시를 가장 유용하게 만들려면 ETag를 사용하지 않도록 설정해야합니다. 당신을 도울 것입니다 다소 생색에서

봐,

http://developer.yahoo.com/performance/rules.html

.

관련 문제