2012-03-05 3 views
137

http 캐싱을 사용하려고합니다.첫 번째 응답이 AppCache (Symfony2)와 함께 개인적인 것이라면 괜찮습니까?

cache-control:max-age=120, public, s-maxage=120 
last-modified:Wed, 29 Feb 2012 19:00:00 GMT 

다음 2 분 :

$response->setPublic(); 
$response->setMaxAge(120); 
$response->setSharedMaxAge(120); 
$response->setLastModified($lastModifiedAt); 

dev에 환경 첫번째 응답에서 개발자 모드가

다음 헤더와 200 : 다음과 같이 내 컨트롤러에서 나는 응답을하고 있어요 모든 응답은 다음 헤더가있는 304입니다.

cache-control:max-age=120, public, s-maxage=120 

이것은 기본적으로 내가 기대하는 것입니다. 자극 모드 응답 헤더

자극 모드

다르다. 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 커널 uses EsiResponseCacheStrategy (HttpCache::handle() 메서드).

if (HttpKernelInterface::MASTER_REQUEST === $type) { 
    $this->esiCacheStrategy->update($response); 
} 

EsiResponseCacheStrategy turns a response into non cacheable를 마지막 응답의 ETag 또는 (EsiResponseCacheStrategy::add() 법) 중 어느 하나를 사용하는 경우 :

if ($response->isValidateable()) { 
    $this->cacheable = false; 
} else { 
    // ... 
} 

Response::isValidateable() 복귀 참 최종 응답의 ETag 또는 헤더가 존재하는 경우를.

그것은 overwriting the Cache-Control header (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

업데이트.

원본 코드에 액세스 할 수 없어서 reproduce the scenario with the latest Symfony standard edition을 시도했습니다.

응답 헤더는 이제 더 일관성이 있지만 여전히 잘못된 것처럼 보입니다.

내가 응답에 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

에서

은 // 코드 i는 $ 커널 = 새로운 AppCache를 ($ 커널)을 사용하지; 그것은 나에게 공개적으로 보여진다. 하지만 그때는 항상 코드 200으로 응답 할 것입니다 ... 나는 revery 프록시 nginx로 사용합니다. – Michael

+0

는'app.php'와'app_dev.php'가 같은가요? (디버그 및 env 무시) – Florian

+1

그 프로젝트에 대한 액세스 권한이 없어 더 이상 확인할 수 없습니다. 컨트롤러는 AppCache가 활성화 된 기본 컨트롤러 였음을 기억합니다. –

답변

-4

발생하는 문제는 의도 한 것입니다. Symfony2 Docs개인공용이 사용되는 상황을 명시 적으로 설명합니다. 기본값은 개인입니다.

+0

내 사건이 아니야, 미안. –

7

나는 동일한 문제에 직면 해있다. 나는 대중에게 헤더를 제공해야했다. 기본적으로 게이트웨이 캐싱이 테스트 모드에서 활성화되면 200 OK를 private으로 반환하고 nocache는 헤더의 유효성을 검사해야합니다.

이 방법으로 문제를 해결했습니다.

app.php에서 사용자 ($ respond-> send)에 응답을 보내기 전에 캐시 제어 헤더를 비워두고 캐시 헤더를 공개 및 최대 보존 기간 (일부 값)으로 설정했습니다. app.php

$response = $kernel->handle($request); 
    $response->headers->set('Cache-Control', ''); 
    $response->setPublic(); 
    $response->setMaxAge(86400); 
    $response->send();   
+0

컨트롤러에서 공개로 설정 되었더라도 개인 응답을 얻었습니까? –

+0

예, 게이트웨이 캐싱을 활성화하고 성능 모드로 실행하면 가능합니다. 정적 인 내용에 대해서는 위의 솔루션이 필요했습니다. – srikanthsatturi