2016-11-18 4 views
1

У меня есть несколько сайтов в субдомене, который я пытаюсь использовать с помощью nginx, некоторые из поддоменов обслуживаются SSL, а некоторые нет. У меня возникли проблемы с тем, чтобы сайты, не содержащие SSL, служили должным образом. Всякий раз, когда я пытаюсь получить к ним доступ, они немедленно перенаправляют (с правильным хостом) в версию SSL/HTTPS. Я добавил блок местоположения ниже. Я прочитал блок nginx при обработке запросов, но не могу понять, как заставить незашифрованные хосты не перенаправляться. (http://nginx.org/en/docs/http/request_processing.html)Nginx Server Block Ordering

server { 
    listen 80; 
    server_name dev.example.ca dev.example.server2.example.tl; 

    location = /favicon.ico { access_log off; log_not_found off; } 
    location/{ 
     include proxy_params; 
     proxy_pass http://unix:/home/example/example/socket.sock; 
    } 
    location /static { 
     autoindex on; 
     alias /home/litobro/example/example/static/; 
    } 
} 

server { 
    listen 80; 
    server_name dutyroster.example.ca; 

    location = /favicon.ico { access_log off; log_not_found off; } 
    location/{ 
     include proxy_params; 
     proxy_pass http://unix:/home/example2/dutyroster/socket.sock; 
    } 
    location /static { 
     autoindex on; 
     alias /home/example/example2/static/; 
    } 

    location /socket.io { 
     proxy_pass http://unix:/home/example/example2/socket.sock; 
     proxy_redirect off; 
     proxy_buffering off; 

     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "Upgrade"; 
    } 
} 

server { 
    listen 80; 
    server_name ex3.server2.example.tl example.ca www.example.ca; 

    location ~ .well-known/acme-challenge/ { 
     root /var/www/letsencrypt; 
     default_type text/plain; 
    } 

    return 301 https://$host$request_uri; 
} 

server { 
    listen 443 ssl http2; 
    server_name example.ca www.example.ca example.server2.example.tl; 

    ssl_certificate /etc/letsencrypt/live/example.ca/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.ca/privkey.pem; 
    include snippets/ssl-params.conf; 

    location = /favicon.ico { access_log off; log_not_found off; } 
    location/{ 
     include proxy_params; 
     proxy_pass http://unix:/home/example/example3/socket.sock; 
    } 
} 

Я заказал блоки сервера таким образом, что порт 80 запросов, мы надеемся получить удар первым, но это все еще, кажется, не работает. Заранее спасибо за помощь! (Блоки сервера в основном лишены реальных доменов, хотя я думаю, что я получил согласованность при замене домена)

+0

Это было сделано! В моих ssl-params я включил Subdomains. Огромное спасибо! Не могли бы вы представить это как ответ, чтобы я мог отметить это решение? – Litobro

ответ

0

Причиной проблемы является заголовок HSTS, который находится внутри snippets/ssl-params.conf. Этот заголовок сообщает браузеру, что веб-сайт будет подключаться только через HTTPS. Вот пример того, как этот заголовок устанавливается с помощью Nginx:

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;"; 

Если значение заголовка содержит includeSubDomains флаг, как в приведенном выше примере, то политика HSTS будет также применяться ко всем субдомены основного домена. Именно поэтому ваш браузер попытался отправить все запросы в субдомен по HTTPS.

Имейте в виду, что современные браузеры хранят список сайтов HSTS в специальном кеше, поэтому простое удаление или изменение заголовка в Nginx может не вызвать немедленного эффекта. Вам необходимо очистить кеш-память HSTS вручную в соответствии с вашим браузером.

Следует также отметить, что использование флага includeSubDomains считается good practice, поэтому сохранение его и выдача сертификата для ваших поддоменов вместо этого могут быть хорошей идеей. В настоящее время существует несколько центров сертификации, таких как Let's Encrypt, которые предоставляют бесплатные и простые в установке сертификаты.

0

извините, у меня нет большого опыта работы с nginx, но у вас есть два серверных блока в конце вашего conf файл. При первом прослушивании порта 80 у вас есть «возврат 301 https: // $ host $ request_uri»; нужна ли эта линия?

попробуйте прокомментировать эту строку и посмотреть, не перенаправлены ли ваши имена серверов, не относящихся к ssl, на https.

+0

Я использую это, чтобы заставить некоторые хосты заставлять ssl, когда я беру эту строку, эти хосты больше не принудительно, но тогда другие хосты также работают без ssl. По какой-то причине он занимает приоритет над другими хостами, и я не знаю, почему. – Litobro