2012-03-19 30 views
8

Tôi đã có một ứng dụng Python Flask chạy trên Heroku (ngăn xếp Cedar) với hai tên miền tùy chỉnh (một với và một không có tên miền phụ www). Tôi muốn chuyển hướng tất cả các yêu cầu gửi đến www. phiên bản của tài nguyên được yêu cầu (nghịch đảo của this question). Tôi nghĩ rằng tôi cần một số phần mềm trung gian WSGI cho điều này nhưng tôi không thể tìm thấy một ví dụ tốt.Làm cách nào để chuyển hướng đến www. phiên bản trang web Flask của tôi trên Heroku?

Làm cách nào để thực hiện việc này?

+0

Để làm rõ, bạn có 'example1.com',' example2.com' và 'www.example2.com'. Bạn muốn tất cả các yêu cầu đến 'example1.com' và' example2.com' được chuyển hướng đến 'www.example2.com'. Đúng không? –

+0

chỉ example.com và www.example.com với example.com/ chuyển hướng đến www.example.com/

+0

Bạn không thể làm điều này với DNS? Tại sao bạn muốn làm điều đó ở lớp ứng dụng? –

Trả lời

12

Một giải pháp dễ dàng hơn để tạo ứng dụng Heroku riêng biệt sẽ là một hàm before_request.

from urlparse import urlparse, urlunparse 

@app.before_request 
def redirect_nonwww(): 
    """Redirect non-www requests to www.""" 
    urlparts = urlparse(request.url) 
    if urlparts.netloc == 'example.com': 
     urlparts_list = list(urlparts) 
     urlparts_list[1] = 'www.example.com' 
     return redirect(urlunparse(urlparts_list), code=301) 

Điều này sẽ chuyển hướng tất cả yêu cầu không www tới www bằng phản hồi "Chuyển 301 vĩnh viễn".

+1

Tôi đã làm một số điều tương tự, nhưng thay vì thay thế một chỉ mục, bạn có thể sử dụng 'urlparts = urlparts._replace (netloc = 'www.example.com')' và 'urlunparse (urlparts)' –

1

Một cách tiếp cận có thể là thêm chức năng để nghe theo số request_started và thực hiện chuyển hướng thích hợp.

Tín hiệu này được gửi trước khi bất kỳ yêu cầu xử lý nào được bắt đầu nhưng khi bối cảnh yêu cầu được thiết lập. Do bối cảnh yêu cầu đã bị ràng buộc , người đăng ký có thể truy cập yêu cầu với các proxy toàn cầu tiêu chuẩn như yêu cầu.

+0

có vẻ đầy hứa hẹn.không chắc chắn làm thế nào tôi sẽ đưa ra một phản ứng từ đó, nhưng nhìn vào nó. –

+0

Ban đầu tôi nghĩ rằng bạn cần phải gây rối với werkzeug nhưng nó không thẳng về phía trước khi bình đựng trong đó. Nếu các tín hiệu không hoạt động, bạn luôn có thể thử tay tại một số [phần mềm trung gian của tôi] (http://werkzeug.pocoo.org/docs/middlewares/). –

3

Theo tài liệu Heroku, bạn có ý tưởng đúng về cách sử dụng tên miền phụ www (ví dụ: www.foo.com) so với tên miền đỉnh (ví dụ: foo.com). gợi ý của họ để đối phó với điều này là sử dụng một lớp DNS redirect:

Để báo:

Subdomain chuyển hướng

kết quả Subdomain chuyển hướng trong một 301 permanent redirect đến subdomain quy định cho tất cả các yêu cầu đến đỉnh tên miền để tất cả hiện tại và các yêu cầu trong tương lai được định tuyến đúng và tên máy chủ đầy đủ www là được hiển thị trong trường vị trí của người dùng.

Hầu như tất cả các nhà cung cấp DNS đều cung cấp dịch vụ chuyển hướng tên miền - đôi khi còn được gọi là chuyển tiếp miền. DNSimple cung cấp URL thuận tiện chuyển hướng được thấy ở đây chuyển hướng từ miền heroku-sslendpoint.com apex tới tên miền phụ www.heroku-sslendpoint.com.

Nguồn: http://devcenter.heroku.com/articles/avoiding-apex-domains-dns-arecords#subdomain_redirection

Hy vọng rằng sẽ giúp!

+0

Vấn đề với các giải pháp dựa trên DNS là chúng không bảo vệ đường dẫn. Vì vậy, điều này đã không làm việc cho tôi. –

0

Điều tôi đã kết thúc là tạo ứng dụng Heroku thứ hai, gán tên máy chủ không phải www cho tên đó và sử dụng bắt tất cả tuyến đường Flask để chuyển hướng đến phiên bản www giữ nguyên đường dẫn.

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