PythonのFlaskでhttpからhttpsにリダイレクトする
2023.02.18
Python の Flask で http から https にリダイレクトする方法。
@app.before_request
def before_request():
if not request.is_secure and app.env != 'development':
url = request.url.replace('http://', 'https://', 1)
code = 301
return redirect(url, code=code)
上の例では Flask の関数を app という名前でデコレートしている。before_request という関数を作り、そこでリダイレクトを行う。かなめは request.is_secure という部分で、request は flask パッケージに最初から入っている。
このコードは下の記事を参考にした。
python flask redirect to https from http - Stack Overflow
https リダイレクトの補足
Flask アプリの多くは Nginx を使う。そのため https リダイレクトは Nginx かアプリで行う。
- Nginx で https リダイレクト
- Flask で https リダイレクト
ロードバランサーを使わないときは Nginx で行うパターンになる。例えば Amazon のロードバランサーは https 通信に対応しているが、ロードバランサーから各インスタンス(Webサーバー)の通信は http である。つまり Nginx を ssl に対応する必要はない。
しかし https リダイレクトにするには、各インスタンスの Nginx に Let's Encrypt を設定しなければいけない。そしてそれはロードバランサーのメリットを台なしにしている。
Amazon などのロードバランサーを使うときは、Flask 側で https リダイレクトするほうが妥当かもしれない。アプリ側で設定するのは気が引くかもしれないが、各インスタンスに Let's Encrypt をインストールするよりはましだと思う。