У мене є nginx та різні субдомени:
a.mydomain.com
b.mydomain.com
c.mydomain.com
Nginx має 4 правила:
1) переписати правило:
server {
listen 80
server_name gl.udesk.org;
root /nowhere;
rewrite ^ https://a.mydomain.com$request_uri permanent;
}
2) правило https:
server {
listen 443;
server_name a.mydomain.com;
root /home/a/a/public;
ssl on;
ssl_certificate conf.d/ssl/a.crt;
ssl_certificate_key conf.d/ssl/a.key;
ssl_protocols ...
ssl_ciphers ...
ssl_prefer_server_ciphers on;
location ...
}
3) правило за замовчуванням http:
server {
listen 80 default_server;
return 444;
}
4) правило за замовчуванням https:
server {
listen 443 default_server;
return 444;
}
Тож якщо я запускаю nginx і:
- якщо я заходжу в браузер на http://a.mydomain.com, він перенаправляє на https://a.mydomain.com, а потім повертає помилку 107 (нетто: ERR_SSL_PROTOCOL_ERROR): помилка протоколу SSL.
- якщо я заходжу у веб-переглядачі на https://b.mydomain.com, я очікую, що він поверне помилку 444 назад. Але замість цього він повертає ту саму помилку 107 (net :: ERR_SSL_PROTOCOL_ERROR): помилка протоколу SSL.
- і так для всіх зареєстрованих постачальником DNS CNAME (тобто a, b, c)
- всі http-версії (наприклад, правило 3 -) працюють як слід:
- http://a.mydomain.com переспрямовує до https: // версії,
- http://b.mydomain.com та http://c.mydomain.com повертають помилку 444 назад у налаштуваннях.
Так чому правила https в nginx настільки складні в налаштуванні і як я повинен їх правильно налаштувати, щоб отримати таку саму поведінку, як і у версії http?
Оновлення:
Створення нового сертифіката та додавання:
ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;
працює зараз, але я мав би рішення без необхідності отримати сертифікат SSL. Просто скиньте всі з'єднання для всіх піддоменів https (порт 443), крім https://a.mydomain.com, не надаючи сертифікат.
nginx
недостатньо розумний, щоб зрозуміти, що йому не потрібен сертифікат для того, що користувач хоче робити.