nginx で SSL振り分け

 ログインページや管理画面など、セキュアにしたいページにだけSSLをかける。というのを nginx でやる方法。

 たとえば、/admin 以下、 /login 以下をSSLにして、それ意外のページは非SSLにしたい場合です。細かい設定は端折って、upstream appserver でバックエンドのサーバが設定されてるときです。

    # HTTP setting
    server {
        listen       80;
        server_name  localhost;
 
        location ~ ^/(admin|login) {
            rewrite ^(.*) https://$http_host$1;
            break;
        }
 
        location / {
            proxy_pass http://appserver;
        }
    }
 
    # HTTPS setting
    server {
        listen       443;
        server_name  localhost;
 
        ssl                  on;
        ssl_certificate      server.pem;
        ssl_certificate_key  server.key;
        ssl_session_timeout  5m;
 
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;
 
        location ~ ^/(admin|login) {
            proxy_pass http://appserver;
            break;
        }
 
        location / {
            rewrite ^(.*) http://$http_host$1;
        }
    }

 こんな感じにすると、http://host/login とかでアクセスが来ると、 https://host/login にリダイレクトされます。逆に、 https://host/top でアクセスが来ると、http://host/top にリダイレクトされます。

 break; とすると、それ以降のマッチングは行われないので、書いとくといいですね。

nginx で SSL振り分け