ฉันพยายามใช้การแคช http ในตัวควบคุมของฉันฉันกำลังตั้งค่าการตอบสนองดังนี้:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
โหมด dev
ในสภาพแวดล้อม dev การตอบสนองแรกคือ 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 {
    // ... 
}
Response :: isValidateable ()ผลตอบแทนจริงถ้า Last-Response หรือส่วนหัว ETag เป็นปัจจุบัน
มันส่งผลในการเขียนทับส่วนหัวของการควบคุมแคช ( เมธอด 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อีกต่อไป
app.phpและapp_dev.phpเหมือนกันหรือไม่ (ละเว้นการดีบักและ env)
                debug=>trueเป็น getOptions () ใน AppCache เพื่อให้ได้X-Symfony-Cacheส่วนหัวหรือไม่?