2017-02-19 24 views
1

Я настраиваю веб-сервер nginx для поддержки нескольких виртуальных хостов. Следуя лучшей практике, я хочу, чтобы любой запрос http: // перенаправлялся на эквивалентный https: //.Как настроить nginx на перенаправление на https ... кроме одного каталога

Это очень просто, но я хочу иметь одно исключение: любой запрос на любой файл под /.well-known/ должен быть передан как http, без перенаправления https. Любой, кто работал с LetsEncrypt, распознает каталог «.well-known» как место, где LetsEncrypt ищет файлы проверки. Эти должны быть обработаны по HTTP-протоколу.

До сих пор у меня есть файл конфигурации «по умолчанию», которая выглядит как:

server { 
    listen 80 default_server; 
    listen [::]:80 default_server ipv6only=on; 
    root /var/www/default/www; 
    index index.php index.html index.htm; 
    location ^~ /.well-known/ { 
     allow all; 
    } 
    location/{ 
     return 301 https://$host$request_uri; 
    } 
} 

Тогда для каждого виртуального хоста, у меня есть отдельный файл, который выглядит следующим образом:

server { 
    listen 443 ssl; 
    server_name myexamplevirtualhost.com; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    # lots more SSL-related stuff 
    location/{ 
     try_files $uri $uri/ =404; 
    } 
} 

server { 
    listen 80; 
    server_name myexamplevirtualhost.com; 
    location/{ 
     return 301 https://$server_name$request_uri; 
    } 
    location /.well-known/ { } 
} 

Если я запрашиваю, например, http://myexamplevirtualhost.com/, я перенаправляюсь на https://myexamplevirtualhost.com/ - это то, что я хочу. Аналогично, прямой запрос для https://myexamplevirtualhost.com/ работает по назначению.

Однако, если я попробую: http://myexamplevirtualhost.com/.well-known/foo123, вместо сервера, просто обслуживающего http://myexamplevirtualhost.com/.well-known/foo123 (который является целью), он перенаправляет на https://myexamplevirtualhost.com/.well-known/foo123.

Я пробовал много разных вещей - меняя порядок правил размещения и т. Д. - но я все еще не могу получить поведение, которое я хочу.

Что я делаю неправильно?

+0

У вас есть HTTP Strict Transport Security? –

+0

Да, серверный блок для отдельных доменов включает в себя: add_header Strict-Transport-Security max-age = 15768000 Хмм. Это может быть моей проблемой. – slamci

ответ

1

Если вы используете HSTS (HTTP Strict Transport Security), вы не сможете «отключить» https для определенных страниц, так как https будет принудительно для всего домена. Возможно, вы сможете использовать некоторую запутанную настройку перенаправления HTTP 302, чтобы сделать эту работу, но я не уверен, зачем вам это нужно. Давайте зашифруем без проблем обновить сертификаты, если ваш широко известный каталог будет обслуживаться через HTTPS.

+0

Я считаю, что использование HSTS действительно является проблемой, как это заметили вы и Ричард Смит. – slamci