2012-03-19 4 views
8

私は、2つのカスタムドメイン(1つはwwwサブドメインなし、もう1つはカスタムドメイン)を使ってHeroku(Cedarスタック)上でPython Flaskアプリケーションを実行しています。私はすべての着信要求をwwwにリダイレクトしたいと思います。要求されたリソースのバージョン(逆の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と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) 

これは、応答を「HTTP 301が恒久的に移動」を使用してWWWにすべての非WWW要求をリダイレクトします。

+1

私はいくつか同様のことをしましたが、インデックスを置き換える代わりに 'urlparts = urlparts._replace(netloc = 'www.example.com')'と 'urlunparse(urlparts)'を使うことができます。 –

1

可能なアプローチの1つは、request_startedでリッスンする関数を追加し、適切なリダイレクトを行うことです。

この信号は、要求処理が開始される前に送信されますが、 要求コンテキストが設定されたときに送信されます。要求コンテキストはすでに にバインドされているため、サブスクライバはrequestなどの標準グローバル プロキシで要求にアクセスできます。

+0

は有望です。どのように私はまだそこからの応答を発行するが、それを検討するか分からない。 –

+0

当初、私はあなたがwerkzeugを混乱させる必要があると思っていましたが、フラスコが真っ直ぐに進むのではありません。信号がうまくいかない場合は、いくつかの[werkzeugミドルウェア](http://werkzeug.pocoo.org/docs/middlewares/)で手を試すことができます。 –

3

Heroku Docsによると、wwwサブドメイン(例:www.foo.com)とapexドメイン(例:foo.com)の使用について正しい考えが得られました。頂点へのすべての要求に対して301 permanent redirectに 指定されたサブドメインに

サブドメインのリダイレクト

サブドメインリダイレクトの結果を:

を引用すると:これに対処するための彼らの提案は、DNS層リダイレクトを使用することですドメインと今後のリクエストはすべて適切にルーティングされ、完全なwwwホスト名は で、ユーザーの場所フィールドに表示されます。

ほとんどすべてのDNSプロバイダがドメインリダイレクションサービスを提供します。ドメイン転送とも呼ばれる があります。 DNSimpleは便利なURLを提供しています heroku-sslendpoint.com apex ドメインからwww.heroku-sslendpoint.comサブドメインにリダイレクトされています。

出典: http://devcenter.heroku.com/articles/avoiding-apex-domains-dns-arecords#subdomain_redirection

役に立てば幸い!

+0

DNSベースのソリューションの問題は、それらがパスを保持しないことです。これは私にとってはうまくいかなかった。 –

0

最後に、2番目のHerokuアプリケーションを作成し、そのホストにwww以外のホスト名を割り当て、すべてのFlaskルートをキャッチしてwwwバージョンにリダイレクトしてパスをそのままにしました。

関連する問題