nginxで 特定ページだけhttpsに振り分ける方法

ログインページや管理画面など、セキュアにしたいページにだけ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; と書くと、それ以降のマッチングは行われないので、書いておくといいですね。

コメントを残す

メールアドレスが公開されることはありません。