Nginx的server_name只匹配Host头中的域名部分,自动忽略冒号后的端口号;端口由listen指令区分,不可写入server_name,否则配置报错。

Nginx 的 server_name 本身不解析或匹配端口号,它只匹配 HTTP 请求头中的 Host 字段内容(即域名或主机名部分),而端口号默认不出现在 Host 头里——除非客户端显式带端口(如 Host: example.com:8080)。
所以,“匹配带端口号的特殊请求”这个说法需要先澄清:
✅ Nginx 真正靠 listen 指令区分端口;
✅ server_name 只管 Host 值(不含端口);
❌ 你不能写 server_name example.com:8080 —— 这是语法错误,Nginx 会启动失败。
但实际中确实存在“带端口的 Host 请求”,比如开发调试、内网直连或某些代理场景下,客户端发来 Host: api.test:3000。这时要让 Nginx 正确路由,关键在于两点:
Host 头含端口时,server_name 怎么配?
当请求的 Host 是 api.test:3000,Nginx 默认只取冒号前的部分做匹配(即 api.test),但前提是你的 listen 端口与请求端口一致。
如果请求是 http://api.test:3000/,且 Nginx 配置为:
server {
listen 3000;
server_name api.test;
...
}
→ 就能正常匹配。
⚠️ 注意:server_name api.test 不需要写 :3000,也不支持写。
但如果客户端强行发送 Host: api.test:3000(非常规行为),而 Nginx 的 listen 是 3000,那么只要 server_name 设置为 api.test,依然能匹配成功 —— 因为 Nginx 内部在匹配前会自动剥离 Host 中的端口部分。
✅ 官方文档明确说明:“Nginx 在匹配 server_name 时,会忽略 Host 请求头中冒号后的端口号。”
想用 server_name 匹配“含端口字样的域名”?不行,但可绕过
例如,你希望 server_name 能识别 example.com:8080 这种字符串 ——
❌ 这不是标准用法,Nginx 不允许 : 出现在 server_name 值中,配置会报错:
nginx: [emerg] invalid server name "example.com:8080" ...
✔️ 替代方案:用 map 提取 Host + 端口信息,再做条件判断
map $host $is_dev_port {
~:^.+:3000$ 1;
default 0;
}
server {
listen 80;
server_name example.com;
location / {
if ($is_dev_port) {
return 200 "Dev mode active (port in Host header)\n";
}
proxy_pass http://backend;
}
}
⚠️ 注意:if 在 location 中有局限,更稳妥的做法是结合 map 和 error_page 或 rewrite 控制流程。
常见误操作与修复
❌ 错误:
server_name www.example.com:443;
→ 启动失败,语法非法。-
❌ 错误:多个
server块listen 80,但server_name都为空或重复,导致请求总落到第一个块
→ 加default_server显式标记兜底:server { listen 80 default_server; server_name _; return 444; # 或返回维护页 } -
✅ 正确组合示例(同一端口,多域名 + 显式端口请求兼容):
server { listen 8000; server_name admin.local api.local; location / { root /var/www/$server_name; } } server { listen 8000; server_name ~^([a-z]+)\.local$; set $subdomain $1; location / { root /var/www/$subdomain; } }访问
http://api.local:8000/或http://admin.local:8000/都能命中对应块。
Nginx 的端口和域名路由是解耦设计:listen 定义入口通道,server_name 定义通道内的“门牌号”。把端口塞进 server_name 不仅无效,还会破坏配置健壮性。真正要处理“端口相关逻辑”,应优先用 listen 分流,辅以 map 或 $host 变量提取分析。











