chuyển hướng tên miền phụ ký tự đại diện sang https (nginx)


20

Tôi đã có chứng nhận ssl ký tự đại diện và tôi đang cố chuyển hướng tất cả lưu lượng truy cập không ssl sang ssl. Hiện tại tôi đang sử dụng các mục sau để chuyển hướng url không phân nhóm đang hoạt động tốt.

server {
listen      80;
server_name mydomain.com;

#Rewrite all nonssl requests to ssl.
rewrite     ^ https://$server_name$request_uri? permanent;
}

Khi tôi làm điều tương tự cho * .mydomain.com, nó sẽ chuyển hướng một cách hợp lý

https://%2A.mydomain.com/

Làm cách nào để bạn chuyển hướng tất cả tên miền phụ sang https tương đương?


2
Thay vì $ server_name, tại sao không lưu trữ $?
cjc

Câu trả lời:


47

Đó là tất cả...

server {
    listen      80;
    server_name *.mydomain.com;

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}

2
Một chút giải thích có thể làm cho điều này một câu trả lời tốt hơn.
Dave M

3
@ dave-m, có cần phải giải thích không? $hostbiến? $request_uri?
cadmi

Nó không hoạt động, vẫn có https: //%2A.handy.travel/
Damon Yuan

2

Tài liệu chính thức của NGINX khuyến khích sử dụng lệnh trả về thay vì sử dụng lệnh viết lại để thực hiện chuyển hướng. Điều này là như vậy, vì yêu cầu được viết lại không có nghĩa là cho máy chủ đó, nhưng nó vẫn được xử lý trong khối máy chủ đó. Vì vậy, chuyển hướng được thực hiện chính xác với một lệnh quay trở lại, vì tất cả quá trình xử lý bị dừng lại và một phản hồi được gửi ngay lập tức. NGINX không khuyến khích viết lại để chuyển hướng ở đây: http://nginx.org/en/docs/http/converting_rewrite_rules.html

Cú pháp của lệnh return là: URL mã trả về; Vì ban đầu bạn đang viết lại vĩnh viễn, do đó, theo đó bạn có thể sử dụng 301 làm mã để phản hồi, cho biết đó là một chuyển hướng vĩnh viễn. Địa chỉ https của bạn sẽ được chuyển trong phần url. Tham khảo: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

Vì vậy, cấu hình chính xác của bạn sẽ là

server {
listen      80;
server_name *.mydomain.com;

#Redirect all nonssl requests to ssl.
return 301 https://$server_name$request_uri;
}

Điều này có thể sẽ cho phép bạn chuyển hướng chính xác đến tên miền ssl của bạn, với một khối máy chủ ký tự đại diện. Bạn cũng có thể thử tên máy chủ chung gạch dưới '_' hoặc $ host như được đề xuất trong nhận xét ở trên. Hãy cho chúng tôi biết!


Mặc dù sử dụng returnthường tốt hơn, nhưng cấu hình được đề xuất không chính xác vì nó vẫn sử dụng $ server_name để chuyển hướng, đó sẽ là "* .mydomain.com". Sửa lỗi đã được @cjc vạch ra trong bình luận ở trên - $hostnên được sử dụng thay vì $server_name.
Maxim Dounin

Có đồng ý. Ah có vẻ như sự chú ý của tôi là một mốt nhất thời!
Apurva Sukant

Thay cho lời gièm pha ở trên, cho phép tôi cung cấp cho bạn một mẹo với cấu hình ssl của bạn để cải thiện đáng kể hiệu suất. Cách hiệu quả nhất để thiết lập SSL nếu bạn đang sử dụng chứng chỉ ký tự đại diện là thiết lập 'ssl ghim' Điều này cho phép bạn thiết lập SSL một lần trên máy chủ mặc định của mình cho tất cả các tên miền phụ và lưu xác thực ssl riêng cho từng tên miền phụ. ssl_stapling trên; độ phân giải 8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify trên; Refference- calomel.org/nginx.html
Apurva Sukant

2
Nên làreturn 301 https://$host$request_uri;
Scarver2

Tôi đang nghe các cổng 80, 8080 VÀ 8181 return 301 https://$server_name$request_uri;để cho họ sử dụng https trên cổng 443. Vấn đề là url được chuyển hướng vẫn có số cổng ban đầu. 80 không phải là vấn đề, nhưng 8080 xuất hiện dưới dạnghttps://example.com:8080
A.Grandt

-1

Hãy thử một cái gì đó như thế này:

server {
  listen 80;
  server_name ~^(.*)\.mydomain\.com$;
  set $servername $1;
  rewrite ^(.*)$ https://$servername.mydomain.com/$1;
}

Việc nắm bắt là xác định máy chủ ký tự đại diện và thực hiện chuyển hướng dựa trên tên của nó.


Nhóm regex cho phép quá mức.
Kzqai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.