web-dev-qa-db-ja.com

Nginx:1つのパスでSSLを強制し、他のパスで非SSLを強制する

Nginx confファイルを設定して、サイトのパスの1つだけにSSLを強制し、残りのすべてに非SSLを強制するにはどうすればよいですか?

たとえば、/ userの下のすべてのURLをhttpsにし、残りのすべてのURLをhttpにしたいとします。

最初の部分については:

rewrite ^/user(.*) https://$http_Host$request_uri?;

「if」を使用したくない。操作の順序を利用すると思いますが、ループに陥りたくありません。

27
pbreitenbach

Nginx構成では、2つの「サーバー」領域が必要です。 1つはポート80用、もう1つはポート443用(非SSLおよびSSL)。非SSL Webサイトに場所を追加するだけで、SSLページにリダイレクトできます。

server {
    root /var/www/
    location / {
    }
    location /user {
        rewrite ^ https://$Host$request_uri? permanent;
    }
}

/ userで終わるすべてのトラフィックをhttps://サーバーに転送します。

次に、443サーバーでその逆を行います。

server {
    listen 443;
    root /var/www/
    location / {
        rewrite ^ http://$Host$request_uri? permanent;
    }
    location /user {
    }
}
38
grufftech

Nginxでは、同じserverブロック内でHTTPとHTTPSの両方を処理できます。したがって、両方のディレクティブを複製する必要はなく、保護するパスをリダイレクトできます

server {
  listen 80 default_server;
  listen 443 ssl;
  ... ssl certificate and other configs ...

  location /user {
    if ($scheme = 'http') {
      rewrite ^ https://$http_Host$request_uri? permanent;
    }
  }

  ... your basic configuration ...
}

必ずnotを入れてssl on行があるので、プレーンHTTPが壊れます。

オプションで、他のすべてのリクエストを同じ方法でHTTPSからHTTPにリダイレクトできます。

if ($scheme = 'https') {
  rewrite ^ http://$http_Host$request_uri? permanent;
}

[〜#〜] update [〜#〜]:Alexey Tenがコメントセクションで親切に指摘しているように、各リクエストでschemeをチェックすることはあまり良い考えではありません。 nginxを構成する宣言的な方法に従う必要があります。この場合、locationによるリダイレクトを使用して2つのサーバーブロックを宣言し、共通ロジックを別のファイルに移動し、両方でincludeします。したがって、GruffTechの答えはより優れています。

13
Hnatt