Tôi có một nginx và các tên miền phụ khác nhau:
a.mydomain.com
b.mydomain.com
c.mydomain.com
Nginx có 4 quy tắc:
1) quy tắc viết lại:
server {
listen 80
server_name gl.udesk.org;
root /nowhere;
rewrite ^ https://a.mydomain.com$request_uri permanent;
}
2) Quy tắc 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) quy tắc mặc định http:
server {
listen 80 default_server;
return 444;
}
4) Quy tắc mặc định https:
server {
listen 443 default_server;
return 444;
}
Vì vậy, nếu tôi bắt đầu nginx và:
- nếu tôi truy cập vào trình duyệt tới http://a.mydomain.com thì nó sẽ chuyển hướng đến https://a.mydomain.com và sau đó nó sẽ trả về Lỗi 107 (net :: ERR_SSL_PROTOCOL_ERROR): lỗi giao thức SSL.
- nếu tôi truy cập trình duyệt tới https://b.mydomain.com, tôi hy vọng rằng nó sẽ trả về Lỗi 444. Nhưng thay vào đó, nó trả về cùng một Lỗi 107 (net :: ERR_SSL_PROTOCOL_ERROR): lỗi giao thức SSL.
- và như vậy đối với tất cả các CNAME của nhà cung cấp DNS đã đăng ký (tức là a, b, c)
- tất cả các phiên bản http (ví dụ quy tắc 3 -) hoạt động như mong đợi:
- http://a.mydomain.com chuyển hướng đến phiên bản https: //,
- http://b.mydomain.com và http://c.mydomain.com đang trả lại Lỗi 444 như được định cấu hình.
Vậy tại sao các quy tắc https trong nginx rất khó cấu hình và tôi nên định cấu hình chúng đúng cách để có hành vi giống như với phiên bản http?
Cập nhật:
Tạo chứng chỉ mới và thêm:
ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;
hoạt động ngay bây giờ, nhưng tôi sẽ có một giải pháp mà không cần bất kỳ chứng chỉ SSL nào. Chỉ cần đặt lại tất cả các kết nối cho tất cả các tên miền phụ https (cổng 443) ngoại trừ https://a.mydomain.com mà không cần cung cấp chứng chỉ.
nginx
không đủ thông minh để nhận ra rằng nó không cần chứng chỉ cho những gì người dùng muốn làm.