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=86400
chỉ thêm nếu không có Cache-Control
tiê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ạ).