nginx基于域名(host)路由

在 Nginx 中实现 基于 Host 的路由(即基于域名的转发),通常不是用 location 指令,而是通过 server_name 结合 server 块来做“虚拟主机”的分发。但如果你想在同一个 server 中通过 location 根据 $host 跳转或代理,也可以用 ifmap 搭配实现。


推荐方案:使用 server_name + 多个 server 实现 Host 路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 对应 y.x.com 的请求
server {
listen 80;
server_name y.x.com;

location / {
proxy_pass http://127.0.0.1:8080;
}
}

# 对应 z.x.com 的请求
server {
listen 80;
server_name z.x.com;

location / {
proxy_pass http://127.0.0.1:9090;
}
}

在一个 server 中做基于 Host 的 location 路由

可以通过 $host 变量配合 if 判断,例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name _;

location / {
if ($host = 'y.x.com') {
proxy_pass http://127.0.0.1:8080;
}

if ($host = 'z.x.com') {
proxy_pass http://127.0.0.1:9090;
}

# fallback
proxy_pass http://127.0.0.1:8000;
}
}

⚠️ 注意:使用 iflocation 中会有副作用,不推荐复杂逻辑。


优雅做法:使用 map 映射 Host 到 backend

1
2
3
4
5
6
7
8
9
10
11
12
13
14
map $host $backend {
default 127.0.0.1:8000;
y.x.com 127.0.0.1:8080;
z.x.com 127.0.0.1:9090;
}

server {
listen 80;
server_name _;

location / {
proxy_pass http://$backend;
}
}

这种方式清晰、性能好,而且易于扩展,非常推荐用于较复杂或大量域名场景。