Va bene se la prima risposta è privata con AppCache (Symfony2)?


140

Sto cercando di utilizzare la cache http. Nel mio controller sto impostando una risposta come segue:

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

modalità di sviluppo

In ambiente di sviluppo la prima risposta è un 200 con le seguenti intestazioni:

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

Per i prossimi 2 minuti ogni risposta è una 304 con le seguenti intestazioni:

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

Questo è fondamentalmente quello che mi aspetto che sia.

modalità prod

In modalità prod le intestazioni di risposta sono diverse. Nota che in app.php ho inserito il kernel in AppCache.

La prima risposta è una 200 con le seguenti intestazioni:

cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT

Quindi è una risposta privata senza cache.

Ogni prossima richiesta è praticamente ciò che mi aspetto che sia; un 304 con le seguenti intestazioni:

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

Dovrei preoccuparmene? È un comportamento previsto?

Cosa succederà se metto il server Varnish o Akamai di fronte?

Ho fatto un po 'di debug e ho pensato che la risposta fosse privata a causa dell'intestazione modificata per ultima. Il kernel HttpCache utilizza EsiResponseCacheStrategy per aggiornare la risposta memorizzata nella cache ( metodo HttpCache :: handle () ).

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

EsiResponseCacheStrategy trasforma una risposta in non memorizzabile nella cache se utilizza Last-Response o ETag ( metodo EsiResponseCacheStrategy :: add () ):

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

Response :: isValidateable () restituisce true se è presente l'intestazione Last-Response o ETag.

Il risultato è la sovrascrittura dell'intestazione Cache-Control ( metodo EsiResponseCacheStrategy :: update () ):

if (!$this->cacheable) {
    $response->headers->set('Cache-Control', 'no-cache, must-revalidate');

    return;
}

Ho fatto questa domanda sul gruppo di utenti di Symfony2 ma finora non ho ricevuto una risposta: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion

Aggiornare.

Dato che non ho più accesso al codice originale, ho provato a riprodurre lo scenario con l'ultima edizione standard di Symfony .

Le intestazioni di risposta ora sono più coerenti, ma sembrano ancora sbagliate.

Non appena imposto Last-Modifiedun'intestazione sulla risposta, la prima risposta fatta da un browser ha un:

Cache-Control:must-revalidate, no-cache, private

Si prevede una seconda risposta:

Cache-Control:max-age=120, public, s-maxage=120

Se evito di inviare l' If-Modified-Sinceintestazione, viene restituita ogni richiesta must-revalidate, no-cache, private.

Non importa più se la richiesta è stata effettuata prodo l' devambiente.


3
quando disabilito $ kernel = new AppCache ($ kernel); mi viene mostrato come pubblico. ma poi risponderà sempre con un codice 200 ... io uso come nginx proxy revery.
Michael,

sei tuo app.phpe app_dev.phplo stesso? (ignorando debug e env)
Florian Klein

1
Non ho più accesso a quel progetto, quindi non posso confermarlo. Ricordo che i controller erano quelli predefiniti con AppCache abilitato.
Jakub Zalas,

1
@Florian Ho provato a riprodurre il problema e ho un comportamento un po 'diverso con l'ultima versione di Symfony (vedi un aggiornamento).
Jakub Zalas,

2
Volete impostare debug=>truein GetOptions () in AppCache in modo da ottenere X-Symfony-Cachedi testa?
denkiryokuhatsuden,

Risposte:


9

Ho affrontato lo stesso problema. Ho dovuto fornire intestazioni "pubbliche" al mio cdn. Per impostazione predefinita, quando la cache del gateway è abilitata in modalità Prod, restituisce 200 OK con privato, nocache deve convalidare le intestazioni.

Ho risolto il problema in questo modo.

In app.php, prima di inviare una risposta all'utente ($ respond-> send), ho sovrascritto l'intestazione del controllo cache su vuota e ho impostato le intestazioni della cache su public e max age (un certo valore).

// snippet di codice da app.php

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

Hai ricevuto risposte private nonostante fossero state rese pubbliche in un controller?
Jakub Zalas,

Sì, se abilito la memorizzazione nella cache del gateway ed eseguo in modalità prod. Avevo bisogno della soluzione sopra per contenuti statici.
srikanthsatturi,

-4

È previsto il comportamento che si verifica. Symfony2 Docs descrive esplicitamente le situazioni in cui si usano private e public , il default è private .


Questo non è il mio caso, scusa.
Jakub Zalas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.