当前位置:首页 > 运维技术 > 正文

nginx如何获取域名?nginx域名配置详解

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

核心变量

  1. $host

    • 最常用,返回客户端请求的域名(优先级:请求行中的主机名 > Host 头部 > 匹配的 server_name)。
    • 自动去除端口号(如 example.com:8080 → example.com)。
    • 示例: location / { add_header X-Domain $host; }
  2. $http_host

    nginx如何获取域名?nginx域名配置详解 第1张

    • 直接返回原始的 Host 请求头(包含端口号,如 example.com:8080)。
    • 如果请求头不存在,则值为空。
    • $server_name

      nginx如何获取域名?nginx域名配置详解 第2张

      • 返回当前匹配的 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; } }

        通过以上方法,您可以灵活获取并操作请求域名,适用于重定向、代理、日志记录等常见场景。

        nginx如何获取域名?nginx域名配置详解 第3张

0