Nginx confファイルを設定して、サイトのパスの1つだけにSSLを強制し、残りのすべてに非SSLを強制するにはどうすればよいですか?
たとえば、/ userの下のすべてのURLをhttpsにし、残りのすべてのURLをhttpにしたいとします。
最初の部分については:
rewrite ^/user(.*) https://$http_Host$request_uri?;
「if」を使用したくない。操作の順序を利用すると思いますが、ループに陥りたくありません。
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 {
}
}
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の答えはより優れています。