[http] ETag와 헤더 만료

나는 둘러 보았지만 ETag Expires Header 또는 둘 중 하나를 사용 해야하는지 알아낼 수 없었습니다 .

내가하려고하는 것은 내 플래시 파일 (및 다른 이미지 및 해당 파일이 변경되었을 때 업데이트되지 않는 것)을 확인하는 것입니다.

파일 이름을 변경하거나 URL 끝에 이상한 문자를 넣어 캐시되지 않도록하는 것과 같은 특별한 작업을하고 싶지 않습니다.

또한 이것을 지원하기 위해 PHP 스크립트에서 프로그래밍 방식으로해야 할 일이 있습니까? 아니면 모두 Apache입니까?



답변

약간 다릅니다. ETag에는 클라이언트가 나중에 해당 파일을 다시 요청할지 여부를 결정하는 데 사용할 수있는 정보가 없습니다. ETag가 전부라면 항상 요청을해야합니다. 그러나 서버가 클라이언트 요청에서 ETag를 읽을 때 서버는 파일을 전송할지 (HTTP 200) 또는 클라이언트에게 로컬 사본 만 사용하도록 지시 할 수 있습니다 (HTTP 304). ETag는 기본적으로 파일의 내용이 변경 될 때 의미 적으로 변경되는 파일의 체크섬입니다.

Expires 헤더는 클라이언트 (및 프록시 / 캐시)가 서버에 요청해야하는지 여부를 결정하는 데 사용됩니다. 만료 날짜가 가까울수록 클라이언트 (또는 프록시)가 서버에서 해당 파일에 대한 HTTP 요청을 할 가능성이 높습니다.

실제로 당신이하고 싶은 것은 BOTH 헤더를 사용하는 것입니다-내용이 얼마나 자주 변경되는지에 따라 Expires 헤더를 합리적인 값으로 설정하십시오. 그런 다음 클라이언트가 서버에 요청을 보낼 때 파일을 다시 보낼지 여부를보다 쉽게 ​​결정할 수 있도록 ETag를 보내도록 구성하십시오.

ETag에 대한 마지막 참고 사항-Apache를 실행하는 여러 시스템에서로드 밸런스 서버 설정을 사용하는 경우 ETag 생성을 해제 할 수 있습니다. 이는 inode가 서버마다 다른 ETag 해시 알고리즘의 일부로 사용되기 때문입니다. 계산의 일부로 inode를 사용하지 않도록 Apache를 구성 할 수 있지만 모든 서버에 대해 동일한 ETag가 생성되도록 파일의 타임 스탬프가 정확히 동일한 지 확인하려고합니다.


답변

EtagLast-modified 헤더는 유효성 검사기 입니다.

파일 및 페이지가 동일한 이름을 유지하더라도 변경된 경우 브라우저 및 / 또는 캐시 (역 프록시)가이를 이해하도록 도와줍니다.

만료캐시 제어새로 고침 정보를 제공 합니다 .

즉, 브라우저가 프록시를 통해 프록시를 사용하여 페이지 / 파일을 캐시에 보관할 수있는 시간 또는 기간을 알려줍니다.

따라서 문제는 일반적으로 어떤 유효성 검사기에서 사용할 태그, 마지막으로 수정했는지, 어떤 새로 고침 정보 헤더를 사용할지, 만료 또는 캐시 제어하는지에 관한 것입니다.


답변

Expires그리고 Cache-Control‘강력한 캐시 헤더’입니다

Last-Modified그리고 ETag“약한 캐시 헤더”입니다

먼저 브라우저 Expires/Cache-Control는 서버에 대한 요청 여부를 결정합니다

요청 Last-Modified/ETag이 필요한 경우 HTTP 요청을 보냅니다 . Etag문서 의 값이 그 값과 일치하면 서버는 내용 대신 200 코드 대신 304 코드를 보냅니다. 브라우저는 캐시에서 내용을로드합니다.


답변

기본적으로 Apache는 파일의 inode 번호, 마지막 수정 날짜 및 크기를 기반으로 Etag 생성합니다. 원하는 태그 는 완벽하게 작동합니다. 디스크에서 파일의 마지막 수정 시간을 기반으로 Last-Modified 헤더를 기본적으로 생성한다고 생각합니다. 원하는 작업을 수행하는 것도 완벽합니다.

당신은 아마도 (에 따라 아파치는 미래에 헤더 날짜가 일 년 만료 보내도록한다 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 브라우저는 내용이 알고 그래서) 캐시 가능. 이를 구성하기 위해 mod_expires 를 살펴보십시오 .


답변

또 다른 요약 :

둘 다 사용해야합니다. ETag는 “서버 측”정보입니다. 만료는 “클라이언트 측”캐싱입니다.

  • 로드 밸런스 서버가있는 경우를 제외하고 ETag를 사용하십시오 . 그것들은 안전하며 클라이언트가 당신이 무언가를 변경할 때마다 새로운 버전의 서버 파일을 가져와야한다고 알립니다.

  • 만료 날짜를 미래에 설정했지만 파일 중 하나 (예 : JS 파일)를 즉시 변경하려는 경우 일부 사용자는 오랫동안 수정 된 버전을 얻지 못할 수 있으므로 만료를주의해서 사용해야합니다!


답변

대답 중 일부가 놓칠 수 있다고 언급하고 싶은 한 가지 추가 사항은 헤더 ETagsExpires/Cache-control헤더 모두에 단점이 있다는 것 입니다.

필요에 따라 헤더에 여분의 바이트를 추가하면 패킷이 증가하여 더 많은 TCP 오버 헤드가 발생할 수 있습니다. 다시 말하지만 헤더에 두 가지를 모두 두는 오버 헤드가 필요한지 또는 요청에 추가 가중치가 추가되어 성능이 저하되는지 확인해야합니다.

Kyle Simpson의이 훌륭한 블로그 게시물에서 자세한 내용을 확인할 수 있습니다. http://calendar.perfplanet.com/2010/bloated-request-response-headers/


답변

필자의 관점에서 Expire Header를 사용하면 서버에서 클라이언트에게 내 데이터가 오래되었을 때 클라이언트에게 알리고 Etag를 사용하면 서버가 클라이언트의 각 요청에 대한 etag 값을 확인할 수 있습니다.