문제

리소스 파일에 대한 ETag HTTP 헤더를 어떻게 생성합니까?

도움이 되었습니까?

해결책

etag는 다음에 파일이 요청될 때 클라이언트가 서버에 다시 보낼 서버가 클라이언트에 보내는 임의의 문자열입니다.

etag는 파일을 기반으로 서버에서 계산 가능해야 합니다.일종의 체크섬과 비슷하지만 보내는 모든 파일을 체크섬하고 싶지 않을 수도 있습니다.

 server                client

        <------------- request file foo

 file foo etag: "xyz"  -------->

        <------------- request file foo
                       etag: "xyz" (what the server just sent)

 (the etag is the same, so the server can send a 304)

"파일 inode 번호/날짜 스탬프/파일 크기" 형식으로 문자열을 구성했습니다.따라서 파일이 클라이언트에 제공된 후 서버에서 변경된 경우 클라이언트가 다시 요청하면 새로 생성된 etag가 일치하지 않습니다.

char *mketag(char *s, struct stat *sb)
{
    sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size);
    return s;
}

다른 팁

리소스 표현이 변경될 때마다 변경되는 한 이를 생성하는 방법은 전적으로 귀하에게 달려 있습니다.

추가적으로 다음과 같은 방식으로 생산하려고 노력해야 합니다.

  1. 각 조건부 GET에서 다시 계산할 필요가 없습니다.
  2. 리소스 내용이 변경되지 않은 경우 변경되지 않습니다.

콘텐츠 해시를 사용하면 계산된 해시를 파일과 함께 저장하지 않으면 #1에서 실패할 수 있습니다.

파일 시스템을 재배치하거나 여러 서버의 콘텐츠를 제공하는 경우 inode 번호를 사용하면 #2에서 실패할 수 있습니다.

작동할 수 있는 메커니즘 중 하나는 리소스 콘텐츠가 변경될 때마다 한 번 계산되고 저장되는 SHA-1 해시 또는 버전 문자열과 같이 완전히 콘텐츠에 종속적인 것을 사용하는 것입니다.

에서 http://developer.yahoo.com/performance/rules.html#etags:

기본적으로 Apache와 IIS는 모두 ETag에 데이터를 포함하여 여러 서버가 있는 웹 사이트에서 유효성 테스트가 성공할 확률을 크게 줄입니다.

...

ETag가 제공하는 유연한 유효성 검사 모델을 활용하지 않는 경우 ETag를 완전히 제거하는 것이 좋습니다.

Bash에서 기본 Apache etag를 생성하는 방법

for file in *; do printf "%x-%x-%x\t$file\n" `stat -c%i $file` `stat -c%s $file` $((`stat -c%Y $file`*1000000)) ; done

etag와 정확히 같은 것을 찾고 있을 때도(브라우저는 서버에서 파일이 변경된 경우에만 파일을 요청함) 전혀 작동하지 않았고 GET 트릭을 사용하여 종료했습니다(js 파일에 get 인수로 타임스탬프를 추가). ).

나는 Adler-32를 HTML 링크 단축기로 사용하고 있습니다.이것이 좋은 생각인지는 확실하지 않지만 지금까지 중복된 항목을 발견하지 못했습니다.이는 etag 생성기로 작동할 수 있습니다.그리고 sha와 같은 암호화 체계를 사용하여 해시를 시도하는 것보다 더 빠르겠지만 아직 확인하지 않았습니다.내가 사용하는 코드는 다음과 같습니다

 shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]

나는 그것들을 사용하지 않고 대신 마지막으로 수정된 헤더를 사용하는 것이 좋습니다.

Askapache에는 이에 대한 유용한 기사가 있습니다.(그들은 보이는 거의 모든 일을 하기 때문입니다!)

http://www.askapache.com/htaccess/apache-speed-etags.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top