url_for
ユーザーがログアウトしたときにリダイレクトURLを生成するために使用しています:
return redirect(url_for('.index', _external=True))
ただし、ページをhttps接続に変更してurl_for
も、 httpが表示されます。
URLの先頭にhttpsurl_for
を追加するように明示的に依頼したいと思います。
変更方法を教えていただけますか?運が悪かったので、Flaskのドキュメントを見ました。
url_for
ユーザーがログアウトしたときにリダイレクトURLを生成するために使用しています:
return redirect(url_for('.index', _external=True))
ただし、ページをhttps接続に変更してurl_for
も、 httpが表示されます。
URLの先頭にhttpsurl_for
を追加するように明示的に依頼したいと思います。
変更方法を教えていただけますか?運が悪かったので、Flaskのドキュメントを見ました。
Flask 0.10を使用すると、ラッピングよりもはるかに優れたソリューションを利用できるようになりますurl_for
。https://github.com/mitsuhiko/flask/commit/b5069d07a24a3c3a54fb056aa6f4076a0e7088c7を見ると、_scheme
パラメーターが追加されています。つまり、次のことができます。
url_for('secure_thingy',
_external=True,
_scheme='https',
viewarg1=1, ...)
_scheme
URLスキームを設定し、のhttps://..
代わりにのようなURLを生成しますhttp://
。_external=True
ただし、デフォルトでは、Flaskは(ホストまたはスキームなしで)パスのみを生成するため、 toからへ/secure_thingy
の移動を含める必要がありますhttps://example.com/secure_thingy
。
ただし、代わりにWebサイトをHTTPSのみにすることを検討してください。少数の「安全な」ルートに対してのみHTTPSを部分的に適用しようとしているようですが、安全なページにリンクしているページが暗号化されていない場合、https-URLが変更されないことを保証できません。これは混合コンテンツに似ています。
呼び出しごとに設定するのではなく、すべてのサーバー生成 URL (url_for
および)の URL スキームに影響を与えたい場合、"正しい" 答えは、次のスニペットのように WSGI ミドルウェアを使用することのようです: http:// flask.pocoo.org/snippets/35/redirect
_scheme
(このフラスコのバグは、それが好ましい方法であることを確認しているようです。)
基本的に、WSGI 環境に がある場合はenviron['wsgi.url_scheme'] = 'https'
、URLurl_for
が生成されます。https:
私のサーバーは、通常の HTTP でサーバーと通信する Elastic Beanstalk ロードバランサーの背後にデプロイされていたため、http://
URLを取得していました。url_for
私のソリューション (Elastic Beanstalk に固有) は次のようなものでした (上記のリンクのスニペットから簡略化):
class ReverseProxied(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
scheme = environ.get('HTTP_X_FORWARDED_PROTO')
if scheme:
environ['wsgi.url_scheme'] = scheme
return self.app(environ, start_response)
app = Flask(__name__)
app.wsgi_app = ReverseProxied(app.wsgi_app)
その Elastic Beanstalk 固有の部分はHTTP_X_FORWARDED_PROTO
. 他の環境では、外部 URL に https が含まれているかどうかを判断する別の方法があります。常に HTTPS を使用したい場合は、無条件に を設定できますenviron['wsgi.url_scheme'] = 'https'
。
PREFERRED_URL_SCHEME
これを行う方法ではありません。リクエストが進行中の場合は常に無視されます。
_scheme
通話ごとに設定するのurl_for()
は非常に面倒で、PREFERRED_URL_SCHEME
うまくいかないようです。ただし、WSGI レベルでリクエストの想定スキームをいじることで、常に HTTPS URL を構築するように Flask を説得することに成功しているようです。
def _force_https(app):
def wrapper(environ, start_response):
environ['wsgi.url_scheme'] = 'https'
return app(environ, start_response)
return wrapper
app = Flask(...)
app = _force_https(app)