回答:
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 {
}
}
/user
sslは他のすべてのURLで開始されます。その結果、ユーザーhttps://www.example.com/
がブラウザのアドレスバーに明示的に入力しても、結果のページはになりますhttp://www.example.com/
。この回答で説明されている設定によって達成されるように、ssl / non-ssl間にauto-url-rewriteを実装する方法はありますが、アドレスバーにユーザーが明示的に入力した場合は明示的なsslリクエストを尊重しますか?ありがとう!
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 ...
}
単純なHTTPを壊すので、そこに行を置かないでくださいssl on
。
オプションで、他のすべてのリクエストをHTTPSからHTTPに同じ方法でリダイレクトできます。
if ($scheme = 'https') {
rewrite ^ http://$http_host$request_uri? permanent;
}
更新:Alexey Tenがコメントセクションで親切に指摘しているように、scheme
各リクエストをチェックすることはあまり良い考えではありません。宣言的な方法でnginxを構成する必要があります。この場合、によるリダイレクトを使用して2つのサーバーブロックを宣言しlocation
、共通のロジックを別のファイルに移動しますinclude
。したがって、GruffTechの答えの方が優れています。
include
一般的なディレクティブにはディレクティブを使用します。いくつかの複製は問題ありません。