フロントでSSL解いてリバースプロキシってのは割と良く作るのだけど、あれれ...?
nginx, ときどき httpd で出来てたことが出来なくて「えっ?」てなる。今後のためにメモ。
nginx.conf
server {
listen 80;
server_name www.example.com;
rewrite ^ https://$http_host$request_uri? permanent;
}
server {
listen 443;
server_name www.example.com;
ssl on;
ssl_certificate ...
ssl_certificate_key ...
:
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend.example.com/;
proxy_redirect http:// https://;
}
}
ポイントは proxy_redirect http:// https://;
の行。後ろが頭のいい奴(例:Rails)だと、X-Forwarded-Proto を見てよしなにヘッダを吐いてくれるんだけど、X-Forwarded-Proto 見てくれない奴が裏側にいる場合には、これで Location ヘッダなんかを強制的に https:// に書き換える必要がある。
apache httpd で言うところの ProxyPassReverse ですな。こっちの方が融通利くみたい。
ちなみに nginx の $http_host と $host は同じようでいて微妙に違うらしい > ネタ元