Có ổn không nếu phản hồi đầu tiên là riêng tư với AppCache (Symfony2)?


140

Tôi đang cố gắng sử dụng bộ nhớ đệm http. Trong bộ điều khiển của tôi, tôi đang thiết lập một phản hồi như sau:

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

chế độ dev

Trong môi trường dev, phản hồi đầu tiên là 200 với các tiêu đề sau:

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

Trong 2 phút tiếp theo, mỗi phản hồi là 304 với các tiêu đề sau:

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

Đây là cơ bản những gì tôi mong đợi nó được.

chế độ prod

Trong tiêu đề chế độ prod là khác nhau. Lưu ý rằng trong app.php tôi bọc kernel trong AppCache.

Phản hồi đầu tiên là 200 với các tiêu đề sau:

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

Vì vậy, đó là một phản ứng không có bộ nhớ cache riêng tư.

Mỗi yêu cầu tiếp theo là khá nhiều những gì tôi mong đợi nó sẽ được; 304 với các tiêu đề sau:

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

Tôi có nên lo lắng về nó? Đó có phải là một hành vi dự kiến?

Điều gì sẽ xảy ra nếu tôi đặt máy chủ Varnish hoặc Akamai trước nó?

Tôi đã thực hiện một chút sửa lỗi và tôi nhận ra rằng phản hồi là riêng tư vì tiêu đề được sửa đổi lần cuối. HttpCache hạt nhân sử dụng EsiResponseCacheStrategy để cập nhật (trả về từ cache HttpCache :: xử lý () phương pháp).

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

EsiResponseCacheStrargety biến một phản hồi thành không thể lưu trong bộ nhớ cache nếu nó sử dụng phương thức Last- Feedback hoặc ETag ( EsiResponseCacheStrargety :: add () ):

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

Phản hồi :: isValidatizable () trả về true nếu tiêu đề Phản hồi cuối hoặc ETag có mặt.

Nó là kết quả trong ghi đè lên header Cache-Control ( EsiResponseCacheStrategy :: update () phương pháp):

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

    return;
}

Tôi đã hỏi câu hỏi này trên nhóm người dùng Symfony2 nhưng cho đến nay tôi vẫn chưa nhận được câu trả lời: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion

Cập nhật.

Vì tôi không còn có quyền truy cập vào mã gốc, tôi đã cố gắng tái tạo kịch bản với phiên bản tiêu chuẩn Symfony mới nhất .

Tiêu đề phản hồi hiện nhất quán hơn, nhưng dường như vẫn sai.

Ngay sau khi tôi đặt Last-Modifiedtiêu đề cho phản hồi, phản hồi đầu tiên được thực hiện bởi trình duyệt có:

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

Phản ứng thứ hai có một dự kiến:

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

Nếu tôi tránh gửi If-Modified-Sincetiêu đề, mọi yêu cầu trả lại must-revalidate, no-cache, private.

Sẽ không có vấn đề gì nếu yêu cầu được thực hiện trong prodhoặc devmôi trường nữa.


3
khi tôi vô hiệu hóa $ kernel = new AppCache ($ kernel); nó được hiển thị như là công khai cho tôi. nhưng sau đó nó sẽ luôn phản hồi với mã 200 ... tôi sử dụng như một nginx proxy hoàn nguyên.
Michael

của bạn app.phpapp_dev.phpgiống nhau? (bỏ qua gỡ lỗi và env)
Florian Klein

1
Tôi không có quyền truy cập vào dự án đó nữa vì vậy tôi không thể xác nhận điều này. Tôi nhớ bộ điều khiển là bộ điều khiển mặc định có bật AppCache.
Jakub Zalas

1
@Florian Tôi đã thử tái tạo vấn đề và tôi đã có một chút hành vi khác với phiên bản Symfony mới nhất (xem bản cập nhật).
Jakub Zalas

2
Bạn có thiết lập debug=>truegetOptions () trong AppCache để nhận X-Symfony-Cachetiêu đề không?
denkiryokuhatsuden

Câu trả lời:


9

Tôi đã phải đối mặt với cùng một vấn đề. Tôi đã phải cung cấp tiêu đề 'công khai' cdn của tôi. Theo mặc định khi bộ nhớ đệm cổng được bật trong chế độ prod, nó trả về 200 OK với private, nocache phải xác thực các tiêu đề.

Tôi đã giải quyết vấn đề theo cách này.

Trong app.php, trước khi tôi gửi phản hồi cho người dùng ($ reply-> send), tôi đã ghi đè tiêu đề kiểm soát bộ đệm vào chỗ trống và đặt tiêu đề bộ đệm thành công khai và tuổi tối đa (một số giá trị).

// đoạn mã từ app.php

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

Bạn có nhận được phản hồi riêng tư mặc dù thực tế chúng được đặt ở chế độ công khai trong bộ điều khiển không?
Jakub Zalas

Có, nếu tôi kích hoạt bộ đệm ẩn cổng và chạy nó trong chế độ prod. Tôi cần giải pháp trên cho nội dung tĩnh.
srikanthsatturi

-4

Hành vi bạn trải nghiệm được dự định. Symfony2 Docs mô tả rõ ràng các tình huống khi riêng tưcông khai được sử dụng, mặc định là riêng tư .


Đây không phải là trường hợp của tôi, xin lỗi.
Jakub Zalas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.