Mam nginx i różne subdomeny:
a.mydomain.com
b.mydomain.com
c.mydomain.com
Nginx ma 4 zasady:
1) reguła przepisywania:
server {
listen 80
server_name gl.udesk.org;
root /nowhere;
rewrite ^ https://a.mydomain.com$request_uri permanent;
}
2) Reguła 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) Domyślna reguła http:
server {
listen 80 default_server;
return 444;
}
4) Domyślna reguła https:
server {
listen 443 default_server;
return 444;
}
Więc jeśli uruchomię nginx i:
- jeśli przejdę do przeglądarki na http://a.mydomain.com , przekieruje na https://a.mydomain.com, a następnie zwróci błąd 107 (net :: ERR_SSL_PROTOCOL_ERROR): błąd protokołu SSL.
- jeśli przejdę do przeglądarki na https://b.mydomain.com , spodziewam się, że zwróci błąd 444. Zamiast tego zwraca ten sam błąd 107 (net :: ERR_SSL_PROTOCOL_ERROR): Błąd protokołu SSL.
- i tak dla wszystkich zarejestrowanych przez dostawcę DNS CNAME (tj. a, b, c)
- wszystkie wersje http (np. reguła 3 -) działają zgodnie z oczekiwaniami:
- http://a.mydomain.com przekierowuje do wersji https: //,
- Witryny http://b.mydomain.com i http://c.mydomain.com zwracają błąd 444 z powrotem zgodnie z konfiguracją.
Dlaczego więc reguły https w Nginx są tak trudne do skonfigurowania i jak mam je odpowiednio skonfigurować, aby uzyskać takie samo zachowanie jak w przypadku wersji HTTP?
Aktualizacja:
Tworzenie nowego certyfikatu i dodawanie:
ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;
działa teraz, ale miałbym rozwiązanie bez wymaganego certyfikatu SSL. Wystarczy zresetować wszystkie połączenia dla wszystkich subdomen https (port 443) oprócz https://a.mydomain.com bez podawania certyfikatu.
nginx
nie jest wystarczająco inteligentny, aby zdać sobie sprawę, że nie potrzebuje certyfikatu do tego, co użytkownik chce zrobić.