Nginx的server_name不支持直接匹配IPv6地址,它仅用于匹配HTTP Host头中的域名;真正决定IPv6访问能力的是listen指令,需配置listen [::]:80或listen [2001:db8::1]:80,并确保系统已启用IPv6监听、防火墙放行且DNS配置AAAA记录以实现可靠路由。

server_name 本身不直接支持 IPv6 地址作为值,它用于匹配 HTTP 请求头中的 Host 字段(即域名),而 Host 字段规范中不允许直接填 IPv6 地址字面量(如 2001:db8::1),除非用方括号包裹且符合 RFC 3986 格式 —— 但绝大多数浏览器和客户端在发送请求时,不会把 IPv6 地址作为 Host 值发送。所以重点不在 server_name,而在于 Nginx 如何监听并响应来自 IPv6 的请求。
真正决定能否通过 IPv6 访问的,是 listen 指令;server_name 只负责区分同 IP/端口下的多个虚拟主机(比如多个域名共用一个 IPv6 地址)。下面分场景说明:
✅ 正确做法:用 listen [::]:80 + 合理设置 server_name
server {
listen 80; # 监听 IPv4
listen [::]:80; # 监听 IPv6(所有地址)
server_name example.com; # 匹配 Host: example.com
# 其他配置...
}- 当用户用 IPv6 地址访问(如
curl -g 'http://[2001:db8::1]/'),只要没带Host头或 Host 不匹配,Nginx 会走默认 server(即第一个匹配该端口的 server 块); - 如果你希望某个 server 块专门响应某 IPv6 地址的请求(非靠 Host 匹配),应使用
listen [2001:db8::1]:80,并确保该地址已配置在系统网卡上。
⚠️ 注意:server_name 写 IPv6 地址?不推荐,基本无效
以下写法没有实际意义,也不会让 Nginx 接收 IPv6 请求:
server_name [2001:db8::1]; # ❌ 错误:Host 头不会发这个,无法匹配 server_name "2001:db8::1"; # ❌ 同样无效
原因:
- 客户端发起 HTTP 请求时,若用 IPv6 地址直连(如
http://[2001:db8::1]/),标准行为是不发送 Host 头(HTTP/1.0)或发送空 Host(某些实现),或者按 RFC 规范发送[2001:db8::1]—— 但 Nginx 默认不启用underscores_in_headers,且这种 Host 值极少见、不可靠; - 浏览器通常只在输入域名时才发
Host: example.com;输入http://[...]/时多数不发 Host,或发得不规范。
✅ 实用建议:IPv6 访问下如何确保路由到正确 server?
优先用域名访问
给你的 IPv6 地址配置 DNS AAAA 记录(如example.com IN AAAA 2001:db8::1),然后保持server_name example.com不变。用户访问http://example.com时,DNS 返回 IPv6 地址,连接自动走 IPv6,Host 头也正常发送。-
若必须用 IPv6 地址直连测试
- 确保该 IPv6 地址已分配给服务器网卡(
ip -6 addr show可查); - 在 server 块中明确监听该地址:
server { listen [2001:db8::1]:80; server_name ""; # 或留空,避免 Host 匹配干扰 # …… } - 测试命令(注意
-g参数让 curl 支持 IPv6 字面量):curl -g 'http://[2001:db8::1]/'
- 确保该 IPv6 地址已分配给服务器网卡(
-
设默认 server(兜底)
如果有多个 server 块,想让 IPv6 直连请求落到特定站点,把它设为该端口的默认 server:server { listen [::]:80 default_server; # ← 关键:default_server server_name _; # …… }
? 补充验证要点
- 检查 Nginx 是否编译了 IPv6 支持:
nginx -V 2>&1 | grep -o with-ipv6
- 查看是否真在监听 IPv6:
ss -tuln | grep ':80' # 应看到类似:tcp6 0 0 :::80 :::* LISTEN
- 检查防火墙放行 IPv6:
ip6tables -L INPUT | grep :80 # 或 ufw:sudo ufw allow 'Nginx Full'
不复杂但容易忽略。


















