Как мне настроить файл конфигурации Nginx, чтобы принудительно использовать SSL только на одном из путей на моем сайте и не использовать SSL для всех остальных?
Например, я хочу, чтобы все URL-адреса в / user были https, а все остальные URL-адреса были http.
По первой части у меня:
rewrite ^/user(.*) https://$http_host$request_uri?;
Я не хочу использовать «если». Я предполагаю, что он воспользуется преимуществом порядка работы, но я не хочу зацикливаться.
В вашей конфигурации nginx у вас должно быть две «серверных» области. Один для порта 80 и один для порта 443 (без SSL и SSL). Просто добавьте местоположение на своем веб-сайте без SSL для перенаправления на свою страницу 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 позволяет обрабатывать как HTTP, так и HTTPS в рамках одного server
блок. Таким образом, вам не нужно дублировать директивы для обеих и можно перенаправить путь, который вы хотите защитить.
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 ...
}
Быть уверенным не класть ssl on
строка там, потому что это нарушит простой HTTP.
При желании вы можете перенаправить все остальные запросы с HTTPS обратно на HTTP таким же образом:
if ($scheme = 'https') {
rewrite ^ http://$http_host$request_uri? permanent;
}
ОБНОВИТЬ: как любезно отмечает Алексей Тен в разделе комментариев, проверяя scheme
по каждому запросу не очень яркая идея. Вы должны следовать декларативному способу настройки вашего nginx. В этом случае объявите два серверных блока с редиректами по location
, переместите общую логику в отдельный файл и include
это в обоих. Так что ответ GruffTech лучше.