http 캐싱을 사용하려고합니다. 내 컨트롤러에서 다음과 같이 응답을 설정하고 있습니다.
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
개발 모드
개발 환경에서 첫 번째 응답은 다음 헤더가있는 200입니다.
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
다음 2 분 동안 모든 응답은 다음 헤더가있는 304입니다.
cache-control:max-age=120, public, s-maxage=120
이것은 기본적으로 내가 기대하는 것입니다.
자극 모드
prod 모드에서는 응답 헤더가 다릅니다. app.php에서는 AppCache에서 커널을 래핑합니다.
첫 번째 응답은 다음 헤더가있는 200입니다.
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
따라서 비공개 캐시 없음 응답입니다.
모든 다음 요청은 내가 기대하는 것과 거의 같습니다. 다음 헤더가있는 304 :
cache-control:max-age=120, public, s-maxage=120
걱정해야합니까? 예상되는 행동입니까?
Varnish 또는 Akamai 서버를 앞에두면 어떻게됩니까?
나는 약간의 디버깅을했고 마지막으로 수정 된 헤더로 인해 응답이 비공개라고 생각했습니다. HttpCache 커널 은 EsiResponseCacheStrategy 를 사용하여 캐시 된 응답을 업데이트합니다 ( HttpCache :: handle () 메서드).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy 는 Last-Response 또는 ETag ( EsiResponseCacheStrategy :: add () 메서드)를 사용하는 경우 응답을 캐시 할 수 없는 상태로 바꿉니다 .
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Last-Response 또는 ETag 헤더가 있으면 Response :: isValidateable () 이 true를 반환합니다.
캐시 제어 헤더 ( EsiResponseCacheStrategy :: update () 메소드) 를 겹쳐 씁니다 .
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
Symfony2 사용자 그룹 에서이 질문을했지만 지금까지 답변을 얻지 못했습니다 : https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
최신 정보.
더 이상 원본 코드에 액세스 할 수 없으므로 최신 Symfony 표준 버전으로 시나리오 를 재현 하려고했습니다 .
응답 헤더가 더 일관성이 있지만 여전히 잘못된 것 같습니다.
Last-Modified
응답에 헤더를 설정하자마자 브라우저의 첫 번째 응답은 다음과 같습니다.
Cache-Control:must-revalidate, no-cache, private
두 번째 응답은 다음과 같습니다.
Cache-Control:max-age=120, public, s-maxage=120
If-Modified-Since
헤더를 보내지 않으면 모든 요청이를 반환합니다 must-revalidate, no-cache, private
.
요청이 이루어진 경우 그것은 중요하지 않습니다 prod
또는 dev
더 이상 환경을 제공합니다.
답변
나는 같은 문제에 직면했다. 내 CDN에 ‘공개’헤더를 제공해야했습니다. 기본적으로 게이트웨이 캐싱이 prod 모드에서 활성화되면 개인은 200 OK를 반환하고 nocache는 헤더의 유효성을 검사해야합니다.
이런 식으로 문제를 해결했습니다.
app.php에서 사용자에게 응답을 보내기 전에 ($ respond-> send) 캐시 제어 헤더를 공백으로 덮어 쓰고 캐시 헤더를 public 및 max age (일부 값)로 설정했습니다.
// app.php의 코드 스 니펫
$response = $kernel->handle($request);
$response->headers->set('Cache-Control', '');
$response->setPublic();
$response->setMaxAge(86400);
$response->send();