LoginSignup
35
36

More than 5 years have passed since last update.

Nginx + Tomcatのリバースプロキシでのリダイレクト対応

Last updated at Posted at 2014-11-28

※ 同タイトルの記事を削除してしまったので、再作成しました。

事象

表題の通りのことをやってたら、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でのリダイレクトが動作することを確認しました。

参考ページ

以下を参考にさせていただきました。
ありがとうございました。

35
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
36