Nếu bạn return 301 https://$host$request_uri;
là phản hồi mặc định trên cổng 80, thì máy chủ của bạn sớm muộn cũng có thể nhận được danh sách các proxy mở [1] và bắt đầu bị lạm dụng để gửi lưu lượng truy cập ở nơi khác trên Internet. Nếu nhật ký của bạn chứa đầy những thông điệp như thế này, thì bạn biết điều đó đã xảy ra với bạn:
42.232.104.114 - - [25/Mar/2018:04:50:49 +0000] "GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1" 301 185 "http://www.ioffer.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Hotbar 4.1.8.0; RogueCleaner; Alexa Toolbar)"
Vấn đề là nó $host
sẽ phản hồi lại bất cứ thứ gì trình duyệt gửi trong Host
tiêu đề hoặc thậm chí tên máy chủ từ dòng mở của HTTP, như thế này:
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
Vì vấn đề đó, một số câu trả lời khác ở đây khuyên bạn nên sử dụng $server_name
thay vì $host
. $server_name
luôn luôn đánh giá những gì bạn đưa vào server_name
khai báo. Nhưng nếu bạn có nhiều tên miền phụ ở đó hoặc sử dụng ký tự đại diện, điều đó sẽ không hoạt động, bởi vì $server_name
chỉ sử dụng mục nhập đầu tiên sau khi server_name
khai báo, và quan trọng hơn là sẽ trả lại ký tự đại diện (không mở rộng nó).
Vậy làm thế nào để hỗ trợ nhiều tên miền trong khi duy trì bảo mật? Trên các hệ thống của riêng tôi, tôi đã xử lý vấn đề nan giải này bằng cách trước tiên liệt kê một default_server
khối không sử dụng $host
, sau đó liệt kê một khối ký tự đại diện:
server {
listen 80 default_server;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name *.example.com;
return 301 https://$host$request_uri;
}
(Bạn cũng có thể liệt kê nhiều tên miền trong khối thứ hai.)
Với sự kết hợp đó, các tên miền chưa từng có sẽ được chuyển hướng đến một nơi nào đó được mã hóa cứng (luôn luôn example.com
) và các tên miền phù hợp với chính bạn sẽ đến đúng nơi. Máy chủ của bạn sẽ không hữu ích như một proxy mở, vì vậy bạn sẽ không gặp rắc rối.
Nếu bạn cảm thấy khó chịu, tôi cho rằng bạn cũng có thể làm cho default_server
khối không khớp với bất kỳ tên miền hợp pháp nào của bạn và phục vụ một cái gì đó gây khó chịu. . . .
[1] Về mặt kỹ thuật "proxy" là từ sai, vì máy chủ của bạn không hoạt động và đáp ứng các yêu cầu cho khách hàng, chỉ gửi một chuyển hướng, nhưng tôi không chắc từ nào sẽ đúng. Tôi cũng không chắc mục tiêu là gì, nhưng nó sẽ lấp đầy các bản ghi của bạn với tiếng ồn và tiêu tốn CPU và băng thông của bạn, vì vậy bạn cũng có thể dừng lại với nó.