Không có Tiêu đề kiểm soát bộ đệm cho các tệp từ AWS CloudFront với S3 Origin


27

Chúng tôi mới chuyển sang Amazon AWS. Chúng tôi hiện có một phiên bản EC2 hoạt động tốt. Nó đang chạy Nginx ở phía trước và Apache ở phía sau. Điều đó cũng chạy tốt. Tất cả các trang web được khởi chạy đúng cách và bao gồm tiêu đề Kiểm soát bộ đệm cho các tệp được cung cấp từ EC2.

Vấn đề là với TẤT CẢ các tệp tĩnh mà chúng tôi đã đặt trong Amazon S3 đang được truy cập thông qua CloudFront CDN . Chúng tôi có thể truy cập các tệp tốt (và không có vấn đề gì với CORS), nhưng rõ ràng CloudFront không phục vụ các tệp có tiêu đề Cache-Control. Chúng tôi muốn tận dụng bộ nhớ đệm trình duyệt.

Theo cách tôi thấy, phiên bản EC2 không đóng vai trò ở đây vì các tệp tĩnh đang được S3 + CloudFront phục vụ trực tiếp, yêu cầu không đến Máy chủ Web trong EC2.

Tôi hoàn toàn lạc lối.

Câu hỏi: 1) Làm cách nào để đặt Kiểm soát bộ đệm trong trường hợp này? 2) Có thể đặt Kiểm soát bộ đệm không? Từ S3 hay CloudFront?

Lưu ý: Tôi đã nhấn một vài trang trong Google nơi bạn có thể đặt Tiêu đề trong S3 cho các đối tượng riêng lẻ. Đó thực sự không phải là một cách hiệu quả để làm điều đó đặc biệt vì trong trường hợp của tôi, chúng ta đang nói về một số đối tượng.

Cảm ơn!


Vui lòng đăng URL cho một đối tượng trong S3 và URL CloudFront có thể áp dụng. Tôi muốn xem hành vi bạn mô tả bản thân mình. Thay thế đăng các CURL cho cả hai, hiển thị các tiêu đề.
Tim

Tôi đã có thể thêm tiêu đề tùy chỉnh "Hết hạn: Chủ nhật, ngày 15 tháng 10 năm 2027 13:46:07 GMT" bằng cách chỉnh sửa nguồn gốc trong console.aws.amazon.com/cloudfront/home . Tuy nhiên nó dường như không hoạt động. Làm thế nào bạn làm điều đó cuối cùng?
Manolo

Câu trả lời:


31

Tôi đã nhấn một vài trang trong Google nơi bạn có thể đặt Tiêu đề trong S3 cho các đối tượng riêng lẻ. Đó thực sự không phải là một cách hiệu quả để làm điều đó đặc biệt vì trong trường hợp của tôi, chúng ta đang nói về một số đối tượng.

Chà, "hiệu quả" hay không, đó là cách nó thực sự được thiết kế để hoạt động.

CloudFront không thêm Cache-Control: tiêu đề.

Truyền qua CloudFront (và cũng tôn trọng, trừ khi được định cấu hình khác) các Cache-Control:tiêu đề được cung cấp bởi máy chủ gốc, trong trường hợp này là S3.

Để có được Cache-Control:các tiêu đề do S3 cung cấp khi tìm nạp đối tượng, chúng phải được cung cấp khi đối tượng được tải lên S3 hoặc được thêm vào siêu dữ liệu của đối tượng bằng thao tác đặt + sao chép tiếp theo, có thể được sử dụng để sao chép bên trong một đối tượng vào chính nó S3, sửa đổi siêu dữ liệu trong quy trình. Đây là những gì giao diện điều khiển làm, đằng sau hậu trường, nếu bạn chỉnh sửa siêu dữ liệu đối tượng.

Ngoài ra còn có (trong trường hợp bạn đang tự hỏi) không có cài đặt toàn cục nào trong S3 để buộc tất cả các đối tượng trong nhóm trả về các tiêu đề này - đó là thuộc tính cho mỗi đối tượng.


Cập nhật: Lambda @ Edge là một tính năng mới trong CloudFront cho phép bạn kích hoạt các kích hoạt chống lại các yêu cầu và / hoặc phản hồi, giữa trình xem và bộ đệm và / hoặc bộ đệm và nguồn gốc, chạy mã được viết bằng Node.js dựa trên cấu trúc đối tượng yêu cầu / phản hồi đơn giản được tiếp xúc bởi CloudFront.

Một trong những ứng dụng chính cho tính năng này là thao túng các tiêu đề ... vì vậy trong khi những điều trên vẫn chính xác - bản thân CloudFront không thêm Cache-Control- giờ đây có thể thêm chức năng Lambda để thêm chúng vào phản hồi được trả về từ CloudFront.

Ví dụ này Cache-Control: public, max-age=86400chỉ thêm nếu không có Cache-Controltiêu đề đã có trên phản hồi.

Việc sử dụng mã này trong trình kích hoạt Phản hồi gốc sẽ khiến nó kích hoạt mỗi khi CloudFront tìm nạp một đối tượng từ gốc và sửa đổi phản hồi trước khi CloudFront lưu trữ nó.

'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    if(!response.headers['cache-control'])
    {
        response.headers['cache-control'] = [{ 
            key:   'Cache-Control', 
            value: 'public, max-age=86400' 
        }];
    }

    callback(null, response);
};

Cập nhật (2018-06-20): Gần đây, tôi đã gửi yêu cầu tính năng cho nhóm CloudFront để cho phép cấu hình các tiêu đề phản hồi gốc tĩnh như các thuộc tính gốc, tương tự như cách có thể thêm các tiêu đề yêu cầu tĩnh , bây giờ ... nhưng với một xoắn, cho phép mỗi tiêu đề được cấu hình được thêm vào một cách có điều kiện (chỉ khi nguồn gốc không cung cấp tiêu đề đó trong phản hồi) hoặc vô điều kiện (thêm tiêu đề và ghi đè tiêu đề từ gốc, nếu có).

Với các yêu cầu tính năng, bạn thường không nhận được bất kỳ xác nhận nào về việc họ có thực sự xem xét triển khai tính năng mới hay không ... hoặc thậm chí liệu họ có thể đã làm việc với nó hay không ... nó chỉ được thông báo khi chúng được thực hiện. Vì vậy, tôi không có ý tưởng nếu những điều này sẽ được thực hiện. Có một lập luận được đưa ra là vì khả năng này đã có sẵn thông qua Lambda @ Edge, nên không cần nó trong chức năng cơ bản ... nhưng đối số của tôi là cơ sở chức năng không đầy đủ tính năng mà không có khả năng thực hiện thao tác tiêu đề phản hồi tĩnh đơn giản và nếu đây là lý do duy nhất cần kích hoạt, thì yêu cầu kích hoạt Lambda là một chi phí không cần thiết, về mặt tài chính và độ trễ bổ sung (mặc dù không nhất thiết phải là chi phí xa lạ).


Nó vẫn còn khó chịu mặc dù.
Erica Kane


1
Tada, thực sự, @Kunal. Đó là một ví dụ về những gì tôi đã đề cập trong câu trả lời là "được thêm vào siêu dữ liệu của đối tượng bằng thao tác đặt + sao chép tiếp theo." Sử dụng nó một cách thận trọng, và kiểm tra, bởi vì có những cảnh báo. Nó sẽ thiết lập lại tất cả các dấu thời gian của bạn và có thể có ý nghĩa cho việc mã hóa. Nó cũng có thể thay đổi etags đối tượng từ nhiều phần thành định dạng một phần, là một thuật toán khác và sẽ gây nhầm lẫn cho bất kỳ hệ thống nào đã lưu trữ etags ở nơi khác để kiểm tra tính toàn vẹn trong tương lai. Nếu phiên bản được bật trên thùng, chi phí lưu trữ của bạn sẽ tăng gấp đôi trừ khi bạn dọn sạch các phiên bản cũ.
Michael - sqlbot

1
Dịch vụ Lambda @ Edge mới hiện cũng cung cấp một cơ chế cho phép các tiêu đề phản hồi Kiểm soát bộ đệm (trong số các tiêu đề khác) được thêm nhanh chóng. Tôi đã cập nhật câu trả lời với một ví dụ hoạt động về cách thực hiện.
Michael - sqlbot

1
@Broshi "chính sách tin cậy" của vai trò cần liệt kê cả hai dịch vụ lambda và edgelambda. Hãy xem docs.aws.amazon.com/lambda/latest/dg/ .
Michael - sqlbot
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.