Đây là một chút phức tạp hơn so với câu trả lời được chấp nhận chỉ ra.
Hỗ trợ CORS khi sử dụng Cloudfront + S3 thực sự được triển khai trong S3 và nó hoạt động như thế này theo Amazon:
Tiêu đề Origin của yêu cầu phải khớp với phần tử Được phép.
Phương thức yêu cầu (ví dụ: GET hoặc PUT) hoặc tiêu đề Phương thức yêu cầu điều khiển truy cập trong trường hợp yêu cầu TÙY CHỌN trước phải là một trong các yếu tố được cho phép.
Mỗi tiêu đề được liệt kê trong tiêu đề Truy cập-Kiểm soát-Yêu cầu-Tiêu đề của yêu cầu trên yêu cầu preflight phải khớp với phần tử Được phép.
Điều này có ý nghĩa tốt, điều có thể không rõ ràng là nếu không có tiêu đề Xuất xứ nào được gửi bởi khách hàng, thì việc xử lý này hoàn toàn không được thực hiện. Và chúng tôi đang sử dụng Cloudfront ở phía trước, nếu bạn chỉ lưu trữ tài sản tĩnh, có lẽ bạn đã thiết lập nó để bỏ qua tất cả các tiêu đề khi lưu trữ. Do đó, nếu yêu cầu đầu tiên cho mỗi tệp từ một nút cạnh cụ thể không bao gồm tiêu đề Origin, nó sẽ lưu trữ phản hồi mà không có tiêu đề Access-Control-Allow-Origin.
Kết quả là yêu cầu đến đầu tiên sẽ xác định tiêu đề nào được trả về cho tất cả các yêu cầu cho đến khi bộ đệm hết hạn.
Có một số cách để khắc phục / giải pháp này.
- Thiết lập cloudfront để thực hiện bộ đệm ẩn có điều kiện dựa trên tiêu đề "Origin".
Điều này hoạt động tốt nếu bạn chỉ mong đợi một vài hoặc một nguồn gốc duy nhất, nhưng nếu không thì tỷ lệ bộ nhớ đệm của bạn có thể trở nên thực sự tồi tệ.
- Sử dụng Lambda @ edge để đặt các tiêu đề bắt buộc, điều này có thể được thực hiện chỉ một lần cho mỗi yêu cầu gốc (S3).
Hoàn toàn linh hoạt, nhưng thêm chi phí và chi phí.
- Đặt mặt trước đám mây ghi đè tiêu đề "Xuất xứ" thành giá trị giả cho mọi yêu cầu.
Điều này chỉ thực sự hữu ích trong trường hợp "Truy cập-Kiểm soát-Cho phép-Xuất xứ: *" và đó là một chút hack, nhưng có lẽ đây là giải pháp tốt nhất hiện nay khi lưu trữ tài sản tĩnh trên cloudfront + S3.