Bạn hầu như luôn luôn nên sử dụng $host
, vì đó là người duy nhất được đảm bảo có thứ gì đó hợp lý bất kể tác nhân của người dùng hoạt động như thế nào, trừ khi bạn đặc biệt cần ngữ nghĩa của một trong các biến khác.
Sự khác biệt được giải thích trong tài liệu nginx :
$host
chứa "theo thứ tự ưu tiên này: tên máy chủ từ dòng yêu cầu hoặc tên máy chủ từ trường tiêu đề yêu cầu 'Máy chủ' hoặc tên máy chủ khớp với yêu cầu"
$http_host
chứa nội dung của trường tiêu đề "Máy chủ" HTTP, nếu nó có trong yêu cầu
$server_name
chứa server_name
máy chủ ảo đã xử lý yêu cầu, như được xác định trong cấu hình nginx. Nếu a server
chứa nhiều server_name
s, chỉ cái đầu tiên sẽ có mặt trong biến này.
Vì việc các tác nhân người dùng gửi tên máy chủ trong dòng yêu cầu thay vì trong tiêu đề Host: là điều hợp pháp, mặc dù điều này hiếm khi được thực hiện trừ khi kết nối với proxy, bạn phải tính đến điều này.
Bạn cũng phải tính đến trường hợp tác nhân người dùng hoàn toàn không gửi tên máy chủ, ví dụ như các yêu cầu HTTP / 1.0 cổ đại và phần mềm được viết xấu hiện đại. Bạn có thể làm như vậy bằng cách chuyển hướng chúng sang một máy chủ ảo bắt tất cả không phục vụ bất cứ thứ gì, nếu bạn đang phục vụ nhiều trang web hoặc nếu bạn chỉ có một trang web trên máy chủ của mình, bạn có thể xử lý mọi thứ thông qua một máy chủ ảo duy nhất . Trong trường hợp sau, bạn cũng phải tính đến điều này.
Chỉ các $host
tài khoản biến cho tất cả những điều có thể mà tác nhân người dùng có thể làm khi tạo yêu cầu HTTP.
$scheme
và$host
...return 301 /forum/index.php?posts/$arg_p/;
hoạt động tốt.