2013-06-10 23 views
5

Tôi đang chạy lưu trữ tĩnh trên s3 cho trang web của mình. Ví dụ. www.somedomain.com trỏ đến một thùng S3.S3 Proxy tới EC2 Instance

Tôi có tên miền phụ api.somedomain.com cho api của mình, nhưng nó đã gây phiền toái để giải quyết các vấn đề về tên miền chéo. Tôi muốn lập bản đồ www.somedomain.com/api/... -> api.somedomain.com/... nhưng không thực hiện chuyển hướng đầy đủ (301) vì tôi muốn có thể đăng bài.

Tôi hiểu rằng Cloudfront cho phép hành vi này, nhưng hơi quá mức vì tôi không cần CDN.

Tôi đã nhận được quy tắc định tuyến để làm việc với chuyển hướng 301, nhưng có cách nào để định cấu hình s3 để chuyển qua yêu cầu của tôi đến ec2 không? Cảm ơn!

+3

Bạn sẽ không thể làm điều đó. S3 chỉ là một hệ thống lưu trữ đối tượng. Bạn có thể làm điều đó với cloudfront như bạn có thể sử dụng một nguồn gốc tùy chỉnh đó là trường hợp ec2 của bạn. – datasage

+0

Yea. Có lý. Tuy nhiên S3 không có quy tắc định tuyến tùy chỉnh tương tự như mod_rewrite. Hình họ cũng có thể chuyển tiếp. = (Đã kết thúc thiết lập Cloudfront, nhưng chi phí nhiều hơn – kungfoo

Trả lời

3

Để giải quyết vấn đề này, tất cả những gì bạn cần làm là chuyển đổi mô hình xung quanh. Trong ví dụ EC2 của bạn, chỉ cần chạy proxy ngược như véc ni hoặc nginx riêng biệt với ứng dụng web của bạn để định tuyến lưu lượng truy cập cho http://www.somedomain.com/api/ * đến ứng dụng web (bạn thậm chí có thể ghi lại url yêu cầu để xóa tiền tố "/ api") và tất cả lưu lượng truy cập khác đến S3. Cấu hình hoặc nginx hoặc véc ni để làm điều này là khá đơn giản (giờ, không phải ngày).

Sau đó, chuyển bản ghi DNS www.somedomain.com của bạn để trỏ đến ví dụ ec2 thay vì S3.

Mẫu phi linted VCL cho véc ni để làm điều này:

backend s3 { 
    .host = "s3.amazonaws.com"; 
    .port = "80"; 
} 

backend app { 
    .host = "localhost"; 
    .port = "8080"; 
} 

sub vcl_recv { 
    if (req.url ~ "^/api/.*") { 
     set req.backend = app; 
     set req.url = regsub(req.url, "^/api", ""); 
     set req.http.Host = "api.somedomain.com"; /* If your web app cares about host */ 
    } 
    else { 
     set req.backend = s3; 
    } 
} 

Sau đó, bạn có thể có được càng ưa thích nếu bạn muốn, ví dụ như sử dụng tuyến đường 53 đến sức khỏe kiểm tra dụ EC2 của bạn và không qua tra cứu DNS vào nhóm s3 của bạn khi nó xuống và định cấu hình các quy tắc lưu vào bộ nhớ cache tùy chỉnh, v.v. Nhưng không cần thiết phải đạt được hành vi mà bạn mong muốn.