2012-03-19 1 views
8

두 개의 사용자 정의 도메인 (하나는 www 서브 도메인이없고 하나는 사용자 정의 도메인)이있는 Heroku (Cedar 스택)에서 실행되는 Python Flask 앱이 있습니다. 들어오는 모든 요청을 www로 리디렉션하고 싶습니다. 요청한 자원의 버전 (역 Y이 this question). 나는 이것을 위해 약간의 WSGI 미들웨어가 필요하다고 생각하지만 좋은 예를 찾을 수는 없다.어떻게 www. Heroku의 Flask 사이트 버전?

어떻게하면됩니까?

+0

분명히하기 위해, 당신은'example1.com','example2.com'과'www.example2.com'을 가지고 있습니다. 'example1.com'과 'example2.com'에 대한 모든 요청을 'www.example2.com'으로 리디렉션하려고합니다. 그 맞습니까? –

+0

example.com 및 www.example.com with example.com/ www.example.com/으로 리디렉션

+0

DNS로이 작업을 수행 할 수 없습니까? 애플리케이션 레이어에서 왜 그렇게하고 싶습니까? –

답변

12

별도의 Heroku 앱을 만드는 것보다 쉬운 해결책은 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) 

이렇게하면 www가 아닌 ​​모든 요청이 "HTTP 301 Moved Permanently"응답을 사용하여 www로 리디렉션됩니다.

+1

나는 비슷한 것을했지만 색인을 대체하는 대신에'urlparts = urlparts._replace (netloc = 'www.example.com')'과'urlunparse (urlparts)'를 사용할 수 있습니다. –

1

한 가지 가능한 접근법은 수신 대기 할 함수를 request_started에 추가하고 적절한 리디렉션을 수행하는 것입니다.

이 신호는 요청 처리가 시작되기 전에 보내지 만 요청 문맥이 설정되었을 때 전송됩니다. 요청 컨텍스트가 이미 이므로, 구독자는 요청과 같은 표준 글로벌 프록시를 사용하여 요청에 액세스 할 수 있습니다.

+0

는 유망 해 보입니다.내가 거기에서 응답을 어떻게 발급하는지 확실하지 않지만 그것으로 들여다 보았다. –

+0

처음에 나는 당신이 werkzeug를 엉망으로 만들 필요가 있다고 생각했지만 플라스크가 그 안에 걸려있는 것과 똑같지는 않았습니다. 신호가 작동하지 않는다면, 언제든지 [werkzeug middleware] (http://werkzeug.pocoo.org/docs/middlewares/)에서 손을 댈 수 있습니다. –

3

Heroku Docs에 따르면 www 하위 도메인 (예 : www.foo.com)과 apex 도메인 (예 : foo.com) 사용에 대한 올바른 아이디어가 있습니다. 정점에 대한 모든 요청에 ​​대한 301 permanent redirect에 지정된 하위 도메인에

하위 도메인 리디렉션

하위 도메인 리디렉션 결과 :

인용하려면이 다루는 그들의 제안은 DNS 계층 리디렉션을 사용하는 것입니다 도메인이므로 현재의 모든 주소는 이고 향후 요청은 올바르게 라우팅되며 전체 www 호스트 이름은 사용자의 위치 필드에 입니다.

거의 모든 DNS 공급자는 도메인 리디렉션 서비스를 제공합니다. 도메인 전달이라고도하는 도 있습니다. DNSimple은 heroku-sslendpoint.com apex 도메인에서 www.heroku-sslendpoint.com 하위 도메인으로 리디렉션하는 편리한 URL 리다이렉션을 제공합니다.

출처 : 도움이 http://devcenter.heroku.com/articles/avoiding-apex-domains-dns-arecords#subdomain_redirection

희망!

+0

DNS 기반 솔루션의 문제점은 경로를 보존하지 않는다는 것입니다. 그래서 이것은 나를 위해 작동하지 않았다. –

0

내가 끝내게 된 것은 두 번째 Heroku 앱을 작성하여 www가 아닌 ​​호스트 이름을 할당하고 캐치 모든 Flask 경로를 사용하여 경로를 그대로 유지 한 www 버전으로 리디렉션하는 것입니다.

관련 문제