2015-07-22 17 views
5

Tôi có hai S3 xô được phục vụ như máy chủ gốc CloudFront tôi:Nhiều CloudFront Nguồn gốc với hành vi con đường Redirection

example-bucket-1 
example-bucket-2 

Nội dung của cả hai xô sống trong thư mục gốc của những xô. Tôi đang cố gắng định cấu hình phân phối Cloudfront của mình để định tuyến hoặc viết lại dựa trên mẫu URL. Ví dụ, với những tập tin này

example-bucket-1/something.jpg 
example-bucket-2/something-else.jpg 

Tôi muốn thực hiện các URL trỏ đến các tập tin tương ứng

http://example.cloudfront.net/path1/something.jpg 
http://example.cloudfront.net/path2/something-else.jpg 

tôi đã cố gắng thiết lập các hành vi bộ nhớ cache khớp với các mẫu path1 và path2, nhưng nó doesn' t làm việc. Các mẫu có thực sự tồn tại trong thùng S3 không?

Trả lời

15

Cập nhật: câu trả lời dưới đây là chính xác khi được viết vào năm 2015 và chính xác dựa trên hành vi tích hợp của CloudFront.

Tuy nhiên, việc giới thiệu [email protected] vào năm 2017 sẽ thay đổi động. Lambda @ Edge cho phép bạn khai báo các móc kích hoạt trong luồng CloudFront và viết các hàm Javascript nhỏ kiểm tra và có thể sửa đổi yêu cầu đến, trước khi kiểm tra bộ nhớ cache CloudFront (yêu cầu trình xem) hoặc sau khi kiểm tra bộ nhớ cache (yêu cầu xuất xứ). Điều này cho phép bạn viết lại đường dẫn trong URI yêu cầu. Ví dụ: bạn có thể chuyển đường dẫn yêu cầu từ trình duyệt của /download/images/cat.png để xóa /download, dẫn đến yêu cầu được gửi tới S3 (hoặc mã tùy chỉnh) cho /images/cat.png.

Tùy chọn này không sửa đổi hành vi Cache thực sự sẽ thực hiện yêu cầu, vì điều này luôn dựa trên đường dẫn theo yêu cầu của trình duyệt - nhưng bạn có thể sửa đổi đường dẫn trong chuyến bay sao cho đối tượng được yêu cầu thực tế là tại một đường dẫn khác với đường dẫn mà trình duyệt yêu cầu.

Để chỉ cần thêm tiền tố vào yêu cầu từ trình duyệt, cài đặt Đường dẫn gốc vẫn có thể được sử dụng, như được lưu ý bên dưới, nhưng để xóa hoặc sửa đổi thành phần đường dẫn, hãy yêu cầu Lambda @ Edge.


Có, các mẫu phải tồn tại ở gốc.

CloudFront, nguyên bản. có thể prepend vào đường dẫn cho một nguồn gốc đã cho, nhưng hiện tại nó không có khả năng loại bỏ các phần tử của đường dẫn (không có Lambda @ Edge, như đã lưu ý ở trên).

Nếu tệp của bạn ở số /secret/files/ ở gốc, bạn có thể có mẫu đường dẫn /files/* được chuyển đổi trước khi gửi yêu cầu đến gốc bằng cách đặt "đường dẫn gốc".

Điều ngược lại không đúng. Nếu các tệp nằm trong số /files ở gốc, không có cách tích hợp để phân phối các tệp đó từ mẫu đường dẫn /download/files/*.

Bạn có thể thêm (tiền tố) nhưng không lấy đi.

Giải pháp tương đối đơn giản sẽ là máy chủ proxy ngược trên phiên bản EC2 trong cùng vùng với nhóm S3, trỏ CloudFront đến proxy và proxy tới S3.Proxy sẽ ghi lại yêu cầu HTTP trên đường đến S3 và truyền phản hồi kết quả trở lại CloudFront. Tôi sử dụng một thiết lập như thế này và nó đã không bao giờ thất vọng với hiệu suất của nó. (Phần mềm proxy ngược mà tôi đã phát triển thực sự có thể kiểm tra nhiều nhóm song song hoặc theo chuỗi và trả về phản hồi không phải lỗi đầu tiên mà nó nhận được, với CloudFront và người yêu cầu). Hoặc, nếu sử dụng Điểm cuối trang web S3 làm nguồn gốc tùy chỉnh, bạn có thể sử dụng quy tắc định tuyến chuyển hướng S3 để trả về chuyển hướng đến CloudFront, gửi lại trình duyệt với tiền tố chưa được gỡ bỏ. Điều này có nghĩa là một yêu cầu bổ sung cho từng đối tượng, tăng độ trễ và chi phí một chút, nhưng các quy tắc chuyển hướng S3 có thể được thiết lập để chỉ kích hoạt khi yêu cầu không thực sự khớp với một tệp trong thùng. Điều này rất hữu ích cho việc chuyển đổi từ một cấu trúc phân cấp này sang cấu trúc phân cấp khác.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html

http://docs.aws.amazon.com/AmazonS3/latest/dev/HowDoIWebsiteConfiguration.html

Các vấn đề liên quan