※ 同タイトルの記事を削除してしまったので、再作成しました。
事象
表題の通りのことをやってたら、Tomcat上のアプリケーションで発生したSSLページへのリダイレクトがうまくいかなかったため、
その時に対応したことのメモ書きです。
環境は以下の通りです。
Nginx : ver.1.6.2
Tomcat : ver.7.0.54
OS : CentOS 6.5
事象発生時の設定イメージ
こんな感じでした。
###Nginx側
nginx.conf(IP,URLは適当に変えてあります)
# HTTP用
server {
server_name 210.xxx.yyy.zz;
listen 80;
location /app/ {
proxy_http_version 1.1;
proxy_pass http://210.xxx.yyy.zz:8080/app/;
proxy_redirect http://210. xxx.yyy.zz:8080/app/ /;
proxy_cookie_path /app /;
}
}
# HTTPS用
server {
server_name 210.xxx.yyy.zz;
listen 443 ssl;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
location /app/ {
proxy_http_version 1.1;
proxy_pass http://210.xxx.yyy.zz:58080/app/;
proxy_redirect http://210.xxx.yyy.zz:58080/app/ /;
proxy_cookie_path /app /;
}
}
###Tomcat側
server.xml(IP,URLは適当に変えてあります)
...中略
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="450"
URIEncoding="UTF-8" />
<Connector port="58080" protocol="HTTP/1.1"
proxyPort="443" redirectPort="443"
scheme="https"
secure="true"
connectionTimeout="20000"
maxThreads="450"
URIEncoding="UTF-8" />
...中略
この状態でTomcat上のアプリがSSLページヘのリダイレクトを発生させると、locationヘッダ上はHTTPとなってしまいました。
設定変更
Tomcat側で「X-Forwarded-Proto」によるプロトコル判定を有効化します。
###Tomcat側
server.xml
...中略
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="450"
URIEncoding="UTF-8" />
<Connector port="58080" protocol="HTTP/1.1"
proxyPort="443" redirectPort="443"
scheme="https"
secure="true"
connectionTimeout="20000"
maxThreads="450"
URIEncoding="UTF-8" />
...中略
<Valve className="org.apache.catalina.valves.RemoteIpValve"
protocolHeader="x-forwarded-proto"/>
※ 参考にしたページでは「X-Forwarded-For」なども設定していましたが、リダイレクトの挙動には直接関係無さそうだったので省略しています。
###Nginx側
X-Forwarded-Protoを明示的に設定します。
nginx.conf(IP,URLは適当に変えてあります)
# HTTP用
server {
server_name 210.xxx.yyy.zz;
listen 80;
location /app/ {
proxy_http_version 1.1;
proxy_pass http://210.xxx.yyy.zz:8080/app/;
proxy_redirect http://210. xxx.yyy.zz:8080/app/ /;
proxy_cookie_path /app /;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
これでHTTPSでのリダイレクトが動作することを確認しました。
##参考ページ
以下を参考にさせていただきました。
ありがとうございました。