Apache는 정적 파일에 대해 304 Not Modified 응답을 제공하지 않습니다.

Apache는 정적 파일에 대해 304 Not Modified 응답을 제공하지 않습니다.

저는 파일 시스템에서 대용량 정적 이미지를 제공하는 Apache 웹 서버를 실행하고 있습니다. 다음과 같이 유효한 캐시 헤더를 반환하도록 서버를 구성했습니다.Header merge Cache-Control "public, max-age=31536000, immutable"

모두 훌륭하지만 사용자가 브라우저에서 이미지를 다시 로드하면 Apache는 응답을 반환하지 않습니다 304 Not Modified.

다음 컬 명령을 실행했습니다(기밀 유지를 위해 호스트 이름을 변경했습니다).

curl -o /tmp/image.png -v -u test:example http://blah.example.com/static/images/covers/436g2gu94kxin4x7

다음은 컬의 요청 헤더입니다.

GET /static/images/covers/436g2gu94kxin4x7 HTTP/1.1
Host: blah.example.com
Authorization: Basic dGVzdDpleGFtcGxl
User-Agent: curl/7.64.1
Accept: */*
If-Modified-Since: Thu, 30 Apr 2020 02:21:47 GMT

304 응답을 예상했지만 대신 다음과 같은 결과를 얻었습니다.

HTTP/1.1 200 OK
Date: Fri, 28 Aug 2020 04:59:54 GMT
Server: Apache/2.4.25 (Debian)
Content-Type: image/png
Content-Length: 3115720
Last-Modified: Thu, 30 Apr 2020 02:21:47 GMT
Vary: Accept-Encoding
Cache-Control: public, max-age=31536000, immutable

나는 읽었다Apache 캐싱 가이드, 그러나 그 중 어느 것도 이 상황과 관련이 없는 것 같습니다. 특히 Apache가 원본 서버에 대한 역방향 프록시 역할을 하는 경우를 지원하기 위해 메모리나 디스크에서 Apache 자체 캐시를 구성하는 것에 관한 것입니다.

하지만 이 경우 파일은 이미 로컬 디스크에 저장되어 있습니다. 원본 서버가 없습니다. 나는 Apache가 파일의 별도의 "캐시된" 복사본을 저장하는 것을 원하지 않거나 필요하지 않습니다. 저는 Apache가 Last-Modified디스크에 있는 파일의 날짜가 날짜와 일치하는지 확인 If-Modified-Since하고 304 Not Modified이 경우 반환하기를 원합니다.

어떻게 설정하나요? 조건부 GET을 활성화하려면 Apache가 별도의 캐시된 파일 복사본을 저장하도록 해야 합니까? (아마도 디스크에 저장되어 있는 매우 큰 캐시가 될 것이며 이는 총 낭비입니다.)

답변1

첫째, 정말 캐싱이 안되는 걸까요?

컬이 문제일 수도 있습니다. 304를 반환하는 것으로 알고 있는 URL의 코드를 피곤하게 만들었고 위의 코드를 사용하면 항상 200을 반환합니다. 웹 브라우저의 개발자 도구를 사용해 보셨나요? "캐싱 비활성화"를 선택하지 않으면 URL을 새로 고칠 수 있고 두 번째 새로 고침 시 304가 반환되는 것을 확인할 수 있습니다.

둘째, Apache 버그일 수 있습니다.

결과에 ETag 헤더가 표시되지 않습니다. Apache가 실제로 이것을 추가하지 않는다고 가정하면 아마도 무시해도 됩니다. 하지만 다음과 같은 경우에는 Apache 설정에 이를 추가해 볼 수도 있습니다.

<IfModule mod_headers.c>
    Header unset ETag
</IfModule>
FileETag None

(헤더 모드를 반드시 활성화하세요 a2enmod headers.)

또는 Apache 버전 2.4.42 이상( apache2 -v)을 사용하는 경우 설정에서 다음을 시도해 볼 수 있습니다.

<IfModule mod_deflate.c>
    DeflateAlterETag NoChange
</IfModule>

이 문제는 ETag 끝에 압축 방법을 추가하는 deflate 모듈로 인해 발생했습니다. 이로 인해 Apache는 캐싱을 무시하고 항상 200을 반환했습니다. 자체적으로 말하면 다음과 같습니다.

...압축된 콘텐츠에 대한 조건부 요청에 대한 "HTTP Not Modified"(304) 응답 제공을 방지합니다.

아파치 모듈 mod_deflate

따라서 이를 비활성화하면 일부 캐싱 문제를 해결할 수 있습니다.

관련 정보