문제

NginX가 내 자산 (JS, CSS) 중 일부를 영원히 또는 적어도 오랫동안 캐시하도록 말하려고합니다.

아이디어는 자산 번들이 /assets/ URI 접두어 (예 : /assets/foo-{fingerprint}.js)로 컴파일되어 게시되면 거기에 머물 것이고 변경 될 필요가 없습니다.

인터넷은 다음 규칙을 작성해야합니다.

location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
  gzip_static on; # there's also a .gz of the asset
  expires max;
  add_header Cache-Control public;
  add_header Last-Modified "";
  add_header ETag "";
  break;
}
.

HTTP 코드 304 "수정되지 않음"으로 응답 할 것으로 기대할 것으로 기대하지만, 내가 얻는 것은 매번 일관된 HTTP 200 (OK)입니다.

나는 다른 접근 방식을 시도했다, 예를 들어,

a) 과거의 일정한 지점으로 수정 시간을 명시 적으로 설정합니다.

add_header Last-Modified "Thu, 01 Jan 1970 00:00:00 GMT";
.

b) If-None-Match 점검으로 전환;

add_header ETag $1;
if_modified_since off;
.

그러나 필요에 따라 실제로 작동하는 유일한 것은 다음과 같습니다.

add_header Last-Modified "Thu, 01 Jan 2030 00:00:00 GMT";
if_modified_since before;
.

나는 잃어버린다.이것은 내가 생각한 모든 것에 반하는 것입니다.제발 도와주세요.

도움이 되었습니까?

해결책

당신에게 잘못된 조언을주기 때문에 당신은 당신의 인터넷을 바꿔야합니다.

위치에서 모든 add_header 라인을 제거하십시오 (잉여 brake뿐만 아니라) :

location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
   gzip_static on; # there's also a .gz of the asset
   expires max;
}
.

및 True 인터넷에서 문서를 읽으십시오. http://nginx.org/r/expires HTTP:/TOOLS.IETF.ORG/HTML/RFC2616

다른 팁

내 구성의 일부분이 보입니다.연구 중에 브라우저가 조건부 글꼴 헤더 (e-tag, last-modified)를 사용하여 요청을 검증하기 위해 브라우저가 휴리스틱 한 분석을 사용한다는 것을 깨달았습니다.백 엔드 응답에 많은 의미가 있으므로 서버 리소스를 저장하려면이를 처리 할 수 있습니다.

그러나 정적 파일 (JS, CSS, 이미지)의 측면에서는 조건부 얻기 유효성 검사없이 브라우저를 똑바로 멀리 멀리 할 수 있습니다.변경 사항이있는 경우 파일 이름을 업데이트하는 경우 유용합니다.

구성 의이 부분은 다음과 같습니다.

add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
.

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