Назад | Перейти на главную страницу

Nginx: принудительно использовать SSL на одном пути, без SSL на других

Как мне настроить файл конфигурации 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 лучше.