มันดีไหมถ้าคำตอบแรกเป็นส่วนตัวกับ AppCache (Symfony2)?


140

ฉันพยายามใช้การแคช 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อีกต่อไป


3
เมื่อฉันปิดการใช้งาน $ kernel = new AppCache ($ kernel); มันถูกเปิดเผยต่อสาธารณะ แต่มันจะตอบกลับด้วยรหัส 200 เสมอ ... ฉันใช้เป็น revery proxy nginx
Michael

คุณapp.phpและapp_dev.phpเหมือนกันหรือไม่ (ละเว้นการดีบักและ env)
Florian Klein

1
ฉันไม่สามารถเข้าถึงโครงการนั้นได้อีกต่อไปดังนั้นฉันจึงไม่สามารถยืนยันได้ ฉันจำได้ว่าคอนโทรลเลอร์เป็นค่าเริ่มต้นที่เปิดใช้งาน AppCache
Jakub Zalas

1
@ Florian ฉันพยายามสร้างปัญหาขึ้นมาใหม่และฉันมีพฤติกรรมที่แตกต่างออกไปเล็กน้อยจากเวอร์ชัน Symfony ล่าสุด (ดูการอัปเดต)
Jakub Zalas

2
คุณจะตั้งdebug=>trueเป็น getOptions () ใน AppCache เพื่อให้ได้X-Symfony-Cacheส่วนหัวหรือไม่?
denkiryokuhatsuden

คำตอบ:


9

ฉันประสบปัญหาเดียวกัน ฉันต้องจัดหาส่วนหัว 'สาธารณะ' ของฉัน โดยค่าเริ่มต้นเมื่อเปิดใช้งานการแคชเกตเวย์ในโหมด prod จะส่งคืน 200 OK ด้วยส่วนตัว nocache ต้องตรวจสอบส่วนหัว

ฉันแก้ไขปัญหาด้วยวิธีนี้

ใน app.php ก่อนที่ฉันจะส่งการตอบกลับไปยังผู้ใช้ ($ response-> send) ฉันได้เขียนทับส่วนหัวของการควบคุมแคชเป็นที่ว่างเปล่าและตั้งค่าส่วนหัวของแคชให้เป็นสาธารณะและอายุสูงสุด (บางค่า)

// ข้อมูลโค้ดจาก app.php

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

คุณได้รับคำตอบส่วนตัวแม้ว่าจะถูกเปิดเผยต่อสาธารณะในคอนโทรลเลอร์หรือไม่?
Jakub Zalas

ใช่ถ้าฉันเปิดใช้งานการแคชเกตเวย์และรันในโหมดแยง ฉันต้องการวิธีการแก้ปัญหาข้างต้นสำหรับเนื้อหาคงที่
srikanthsatturi

-4

พฤติกรรมที่คุณพบมีจุดมุ่งหมาย Symfony2 เอกสารอย่างชัดเจนอธิบายสถานการณ์เมื่อภาคเอกชนและประชาชนมีการใช้ค่าเริ่มต้นเป็นส่วนตัว


นี่ไม่ใช่กรณีของฉันขอโทษ
Jakub Zalas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.