Apakah boleh jika tanggapan pertama bersifat pribadi dengan AppCache (Symfony2)?


140

Saya mencoba menggunakan caching http. Di controller saya, saya mengatur respons sebagai berikut:

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

mode dev

Di lingkungan dev, respons pertama adalah 200 dengan tajuk berikut:

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

Untuk 2 menit berikutnya setiap respons adalah 304 dengan tajuk berikut:

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

Ini pada dasarnya yang saya harapkan.

mode prod

Dalam mode prod, respons header berbeda. Perhatikan bahwa di app.php saya membungkus kernel di AppCache.

Respons pertama adalah 200 dengan tajuk berikut:

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

Jadi ini adalah respons tanpa-cache pribadi.

Setiap permintaan berikutnya adalah apa yang saya harapkan; a 304 dengan tajuk berikut:

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

Haruskah saya mengkhawatirkannya? Apakah itu perilaku yang diharapkan?

Apa yang akan terjadi jika saya meletakkan server Varnish atau Akamai di depannya?

Saya melakukan sedikit debugging dan saya pikir respons itu pribadi karena header yang terakhir dimodifikasi. Kernel HttpCache menggunakan EsiResponseCacheStrategy untuk memperbarui respons yang di-cache ( metode HttpCache :: handle () ).

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

EsiResponseCacheStrategy mengubah respons menjadi non-cacheable jika menggunakan Last-Response atau ETag ( EsiResponseCacheStrategy :: add () metode):

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

Response :: isValidateable () mengembalikan true jika Last-Response atau ETag header ada.

Hasilnya menimpa metode Cache-Control header ( EsiResponseCacheStrategy :: update () ):

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

    return;
}

Saya mengajukan pertanyaan ini pada grup pengguna Symfony2 tetapi sejauh ini saya belum mendapatkan jawaban: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion

Memperbarui.

Karena saya tidak lagi memiliki akses ke kode asli saya mencoba mereproduksi skenario dengan edisi standar Symfony terbaru .

Header respons lebih konsisten sekarang, tetapi tampaknya masih salah.

Segera setelah saya mengatur Last-Modifiedtajuk pada respons, respons pertama yang dibuat oleh peramban memiliki:

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

Respons kedua diharapkan:

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

Jika saya menghindari pengiriman If-Modified-Sincetajuk, setiap permintaan kembali must-revalidate, no-cache, private.

Tidak masalah jika permintaan itu dibuat di prodatau devlingkungan lagi.


3
ketika saya menonaktifkan $ kernel = new AppCache ($ kernel); itu ditunjukkan kepada saya untuk umum. tapi kemudian ia akan selalu merespons dengan kode 200 ... saya gunakan sebagai revery proxy nginx.
Michael

Apakah Anda app.phpdan app_dev.phpsama? (mengabaikan debug dan env)
Florian Klein

1
Saya tidak punya akses ke proyek itu lagi jadi saya tidak bisa mengkonfirmasi ini. Saya ingat pengendali adalah yang default dengan AppCache diaktifkan.
Jakub Zalas

1
@Florian Saya mencoba mereproduksi masalah dan saya memiliki perilaku yang sedikit berbeda dengan versi Symfony terbaru (lihat pembaruan).
Jakub Zalas

2
Apakah Anda menetapkan debug=>truegetOptions () di AppCache sehingga Anda mendapatkan X-Symfony-Cachetajuk?
denkiryokuhatsuden

Jawaban:


9

Saya menghadapi masalah yang sama. Saya harus menyediakan tajuk 'publik' cdn saya. Secara default ketika caching gateway diaktifkan dalam mode prod, ia mengembalikan 200 OK dengan pribadi, nocache harus memvalidasi header.

Saya memecahkan masalah dengan cara ini.

Di app.php, sebelum saya mengirim respons ke pengguna ($ response-> kirim), saya telah menimpa header kontrol cache menjadi kosong dan mengatur header cache ke publik dan usia maks (nilai tertentu).

// cuplikan kode dari app.php

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

Apakah Anda mendapatkan respons pribadi meskipun faktanya dipublikasikan di controller?
Jakub Zalas

Ya, jika saya mengaktifkan caching gateway dan menjalankannya dalam mode prod. Saya membutuhkan solusi di atas untuk konten statis.
srikanthsatturi

-4

Perilaku yang Anda alami dimaksudkan. Symfony2 Docs secara eksplisit menggambarkan situasi ketika privat dan publik digunakan, defaultnya privat .


Ini bukan kasus saya, maaf.
Jakub Zalas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.