Posted at 2012-03-26 22:09:55 under テクノロジ (by key)

SSL通信を行うサイトを作ったりなんかしています。

django + fastcgiプロセスの組み合わせでリダイレクトする処理を確認していたところ、 アプリケーションがプロトコルスキームを認識出来ずにhttp://〜にリダイレクトされる問題がありました。

最初はアプリケーションが固定値でhttp://〜と出力しているのかと思い、 自分が書いた部分のコードやサードパーティのライブラリを含めて調査しまくった結果、 どうやらfastcgiプロセスがプロトコルをハンドリング出来ていないようでした(pdb埋め込んで追いかけまくった)。

で、ダメ押しでnginx fastcgi sslなどでググりまくって得た回答は nginxのコンフィグを適切に設定しないさい というものでした。

参考: FastCGI application behind NGINX is unable to detect that HTTPS secure connection is used

というわけで、以下のようなコンフィグを書いたところ、きちんと動くようになりました。

server {
    listen 443;

    # 省略
    location / {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:8083;
        fastcgi_pass_header Authorization;
        fastcgi_params HTTPS on;
        fastcgi_intercept_errors off;
    }
}

djangoのビュー関数が処理するrequestオブジェクト(内部オブジェクトを失念してしまったけどwsgi関連?)には アプリケーション実行時の各種環境変数が含まれていますが、この中にHTTPSというキーがありプロトコル判別にはその値を利用しています。 SSLアクセス時には、ウェブサーバ側で強制的に値を突っ込むことで解決することが出来るというわけですね。

というわけで久々のエントリは備忘録でした。

Tags: django, python
blog comments powered by Disqus