Điểm:0

Cách tránh Crazy Caching với tiêu đề "Vary: Cookie" trong NGINX

lá cờ ke

Tôi biết Thay đổi: Cookiekhông thích, vì nó tạo ra bộ nhớ đệm của mọi biến thể cookie mà người dùng có thể báo cáo. Mặt khác, không có nó, tôi đã phải sử dụng Kiểm soát bộ đệm: không có bộ đệm để báo cho máy chủ bộ nhớ đệm NGINX của tôi bỏ qua hoàn toàn nội dung bộ nhớ đệm đó có thể có một người dùng đăng nhập (tình cờ là mọi trang trong trang web của tôi, vì có một hộp tài khoản ở đầu trang).

Tôi chỉ gửi cookie nếu người dùng đăng nhập, vì vậy hầu hết các lượt xem trang sẽ được hưởng lợi từ bộ nhớ đệm. Tôi muốn thu hẹp nó để chỉ có hai biến thể: một phiên bản được lưu trong bộ nhớ cache dành cho những người dùng có "phương sai" mà họ có không cookie và phiên bản không được lưu trong bộ nhớ cache dành cho những người có cookie (ví dụ: người dùng đã đăng nhập và có cookie xác thực).

Nếu tôi thêm "Vary: Cookie" vào chương trình Perl của mình, có cách nào để tôi nói với NGINX rằng trong trường hợp này, nó chỉ nên chú ý đến việc liệu một sessionId cookie tồn tại hay không? Một cái gì đó dọc theo dòng -- để tạo một tiêu đề giả -- Thay đổi: Cookie('sessionId')? Nếu có một cách để triển khai điều này trong tiêu đề được tạo bởi tập lệnh mà NGINX sau đó sẽ tôn trọng, tôi nghĩ rằng tôi thích cách đó hơn là đưa nó vào cấu hình NGINX, nhưng bất kỳ giải pháp nào cũng sẽ được đánh giá cao.

Tôi không hoàn toàn chắc chắn về cách kiểm tra xem liệu tôi có khiến NGINX phát điên với bộ nhớ đệm hay không, nhưng tôi tự hỏi liệu điều gì đó dọc theo những dòng này có thể hoạt động hay không: đối với người xem chưa đăng nhập, tập lệnh sẽ gửi Thay đổi: Cookie, nhưng đối với người xem đã đăng nhập, nó sẽ gửi cả tiêu đề đó và Kiểm soát bộ đệm: không có bộ đệm. NGINX có hiểu điều này là yêu cầu nó lưu vào bộ đệm phản hồi đầu tiên chứ không phải biến thể không? Hay tôi sẽ làm hỏng thứ gì đó theo cách mà tôi không nắm bắt được?

Cập nhật: Đây là mẫu của một trong các khối máy chủ của tôi:

người phục vụ {
    server_name myservername.tld
    nghe 80;

    địa điểm / {
        proxy_cache $PROXY_CACHE;

        proxy_cache_valid 200 302 60m;
        proxy_cache_valid 404 1m;
        hết thời gian chờ lỗi proxy_cache_use_stale http_429 http_500 http_502 http_503 http_504;
        bật proxy_cache_background_update;
        bật proxy_cache_revalidate;
        proxy_cache_min_uses 1;
        bật proxy_cache_lock;

        proxy_pass $scheme://$APACHE_PROXY_REQ_IP:$APACHE_PROXY_REQ_PORT;
    }

}
Michael Hampton avatar
lá cờ cz
Vui lòng đăng khối nginx `server` của bạn.
lá cờ ke
Tôi đã thêm khối `server`. Cảm ơn!
Điểm:1
lá cờ cz

Bạn nên xem hướng dẫn proxy_no_cacheproxy_cache_bypass.

proxy_no_cache cho nginx biết các điều kiện theo đó nó sẽ không lưu trữ phản hồi từ ứng dụng của bạn. Bạn có thể định nghĩa điều này là bất cứ điều gì bạn muốn, ví dụ:

proxy_no_cache $cookie_sessionid;

proxy_cache_bypass hoạt động theo hướng khác: nó cho nginx biết khi nào một yêu cầu không được phục vụ từ bộ đệm mà thay vào đó được chuyển đến ứng dụng của bạn, ngay cả khi tồn tại một mục nhập được lưu trong bộ đệm.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.