在 Nginx 中获取当前请求的域名(即客户端请求的 Host 头部)可以通过内置变量实现,以下是详细说明和常见用法:

核心变量
-
$host- 最常用,返回客户端请求的域名(优先级:请求行中的主机名 >
Host头部 > 匹配的server_name)。 - 自动去除端口号(如
example.com:8080→example.com)。 - 示例:
location / { add_header X-Domain $host; }
- 最常用,返回客户端请求的域名(优先级:请求行中的主机名 >
-
$http_host- 直接返回原始的
Host请求头(包含端口号,如example.com:8080)。 - 如果请求头不存在,则值为空。
- 直接返回原始的
-
$server_name
- 返回当前匹配的
server块中配置的域名(Nginx 配置中server_name的值)。
- 返回当前匹配的
使用场景示例
日志记录域名
在日志格式中记录请求的域名:
http {
log_format main '$remote_addr - $host "$request"';
access_log /var/log/nginx/access.log main;
}
根据域名重定向
将 www 域名重定向到无 www:
server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 80;
server_name example.com;
# 主配置...
}
反向代理传递域名
将原始域名传递给后端服务:

location / {
proxy_set_header Host $host; # 关键:传递客户端请求的域名
proxy_pass http://backend_server;
}
多域名站点处理
根据域名展示不同内容:
server {
listen 80;
server_name site1.com site2.com;
location / {
if ($host = "site1.com") {
proxy_pass http://backend1;
}
if ($host = "site2.com") {
proxy_pass http://backend2;
}
}
}
注意事项
- 安全性:
$host变量是安全的,已过滤无效字符。 - 端口处理:
$host自动移除端口(如example.com:8080→example.com)。- 需保留端口时用
$http_host。
- 默认域名:
若请求未携带Host头部,Nginx 使用第一个server块处理请求(可通过server { listen ... default_server; }显式指定)。
完整示例
server {
listen 80;
server_name example.com www.example.com;
location / {
# 重定向 www 到非 www
if ($host = "www.example.com") {
return 301 https://example.com$request_uri;
}
# 记录日志(含域名)
access_log /var/log/nginx/example.log;
# 代理到后端并传递域名
proxy_set_header Host $host;
proxy_pass http://localhost:3000;
}
}
通过以上方法,您可以灵活获取并操作请求域名,适用于重定向、代理、日志记录等常见场景。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/286333.html

