Nginx: примусовий SSL на один шлях, не-SSL на інший


27

Як налаштувати конфіденційний файл Nginx для примусового використання SSL лише на одному з контурів на моєму сайті та не-SSL на всіх інших?

Наприклад, я хочу, щоб усі URL-адреси під користувачем були https, а всі інші URL-адреси були http.

У першій частині я маю:

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

Я не хочу використовувати "якщо". Я припускаю, що це скористається порядком роботи, але я не хочу опинятися в циклі.

Відповіді:


38

У вашій конфігурації nginx у вас повинно бути дві області "сервера". Один для порту 80 і один для порту 443 (не для SSL та SSL). Просто додайте розташування на своєму веб-сайті, що не належить до SSL, щоб перенаправити його на свою сторінку SSL.

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

він передасть увесь трафік, який закінчується у / користувача, на ваш https: // сервер.

Тоді на своєму сервері 443 ви робите навпаки.

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

2
Такий підхід хороший, але він потрапляє в пару загальної Пастки , в зокрема «корінь всередині блоку розташування» і «переписує» Оподаткування
kolbyjack

1
Я редагував. Це добре виглядає? Я також вийняв прослуховування 80 і додав http_host.
pbreitenbach

При такій конфігурації з'єднання перемикається з / на ssl / non-ssl, коли користувач переходить по сторінках на сайті, ssl для URL-адрес, розпочатих з, /userі non-ssl для всіх інших URL-адрес. Як результат, навіть користувач явно вводить https://www.example.com/в адресному рядку веб-переглядача результуючу сторінку http://www.example.com/. Чи є спосіб реалізувати auto-url-переписувати між ssl / non-ssl, як це досягнуто налаштуваннями, описаними в цій відповіді, але все ж дотримуйтесь явного запиту ssl, якщо він явно вводиться користувачем в адресному рядку? Спасибі!
побачення

@goodbyeera так. Якщо ідея полягає в тому, щоб змусити користувачів використовувати SSL в певних областях, ми можемо замінити їхні протоколи там, але шанувати їх скрізь, просто видаливши команди переписати з конфігурації сервера 443. Звичайно, тепер, коли вони переходять до захищеної частини, вони все ще переглядатимуть SSL, коли вони перейдуть куди-небудь ще, але це дозволяє людям обирати використовувати SSL з початку роботи.
Чак висихає

13

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 краща.


2
Неефективно складати схему перевірки nginx для кожного запиту.
Олексій Десять,

1
Я знаю, що на це питання відповіли 3 роки тому, але я знайшов це, намагаючись зробити те, що я поступово робив, і просто хотів поділитися своїми результатами з людьми, які будуть слідувати моїм крокам.
Гнат

1
Ну, вам слід прочитати wiki.nginx.org/IfIsEvil
Олексій

1
@AlexeyTen Це не так, "коли ви не можете уникнути використання" якщо "? Чи є інший спосіб мати однакову конфігурацію для HTTP і HTTPS без дублювання директив?
Гнат

2
Використовуйте includeдирективу для загальних директив. Деякі дублювання в порядку.
Олексій Десять,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.