첫 번째 응답이 AppCache (Symfony2)의 개인 응답이면 괜찮습니까?


140

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더 이상 환경을 제공합니다.


3
내가 $ kernel = new AppCache ($ kernel); 비활성화하면 그것은 나에게 공개적으로 표시됩니다. 그러나 그것은 항상 코드 200으로 응답합니다 ... 나는 revery 프록시 nginx로 사용합니다.
Michael

당신 app.phpapp_dev.php같은가요? (디버그 및 환경 무시)
Florian Klein

1
더 이상 해당 프로젝트에 액세스 할 수 없으므로이를 확인할 수 없습니다. 컨트롤러가 AppCache를 활성화 한 기본 컨트롤러 인 것을 기억합니다.
Jakub Zalas

1
@ 플로리안 나는 문제를 재현하려고 노력했으며 최신 Symfony 버전과 약간 다른 동작을했습니다 (업데이트 참조).
Jakub Zalas

2
debug=>trueAppCache에서 getOptions ()로 설정 하여 X-Symfony-Cache헤더 를 얻 습니까?
denkiryokuhatsuden

답변:


9

나는 같은 문제에 직면했다. 내 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();        

컨트롤러에서 공개되었다는 사실에도 불구하고 비공개 응답을 받았습니까?
Jakub Zalas

예, 게이트웨이 캐싱을 활성화하고 prod 모드에서 실행하면 정적 내용에 대한 위의 솔루션이 필요했습니다.
srikanthsatturi

-4

경험 한 행동입니다. Symfony2 Docsprivatepublic 이 사용되는 상황을 명시 적으로 설명하며 기본값은 private 입니다.


이건 내 사건이 아니에요
Jakub Zalas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.