nginx如何获取域名?nginx域名配置详解
- 运维技术
- 2026-02-07
- 3655
在 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 的值)。
- 安全性:$host 变量是安全的,已过滤无效字符。
- 端口处理:
- $host 自动移除端口(如 example.com:8080 → example.com)。
- 需保留端口时用 $http_host。
- 默认域名:
若请求未携带 Host 头部,Nginx 使用第一个 server 块处理请求(可通过 server { listen ... default_server; } 显式指定)。
使用场景示例
日志记录域名
在日志格式中记录请求的域名:
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; } } }
注意事项
完整示例
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; } }
通过以上方法,您可以灵活获取并操作请求域名,适用于重定向、代理、日志记录等常见场景。
