nginx if 判断域名
Nginx域名判断实战:用if指令实现多域名精准路由
在Web服务配置中,域名路由是实现流量分流、访问控制的核心需求。Nginx作为高性能服务器,通过if指令可根据域名动态判断请求流向,结合$host变量与正则匹配,能实现从简单重定向到复杂反向代理的灵活配置。本文将拆解Nginx中if指令的域名判断技巧,结合实战场景解析配置逻辑与避坑指南。
Nginx if指令基础:域名判断的核心变量

Nginx的if指令通过条件判断执行配置块,语法为if (条件) { 指令; }。在域名判断中,最关键的变量是$host(请求头中的Host字段值,如www.example.com),配合$scheme(协议类型)、$request_method(请求方法)等变量,可构建精准的域名匹配条件。
需注意:$host与$server_name的区别——$server_name是server块中预定义的域名列表,而$host是动态请求头中的Host值。当请求的Host与server_name不匹配时,Nginx默认使用第一个server块,此时$host可能与预期域名不符,需提前通过server_name配置避免歧义。
场景一:HTTP强制跳转HTTPS与域名规范化
需求:所有HTTP请求强制跳转至HTTPS,并统一使用非www域名(如example.com)。
配置示例:
server {
listen 80;
server_name www.example.com example.com; # 匹配所有域名
# 1. 先判断协议,强制跳转HTTPS
if ($scheme = http) {
return 301 https://example.com$request_uri;
}
# 2. 再处理域名规范化(www→非www)
if ($host = 'www.example.com') {
return 301 https://example.com$request_uri;
}
# 3. 处理静态资源(如前端页面)
location / {
root /var/www/html;
index index.html;
}
}
关键点:
$request_uri保留原请求路径与参数,避免跳转后丢失URL信息;- 先判断协议再处理域名,避免因顺序错误导致重复跳转(如同时满足
http和www条件时,两次301跳转)。
场景二:基于域名的反向代理路由
需求:不同业务域名(如api.example.com、admin.example.com)分流至不同后端服务。
配置示例:
server {
listen 443 ssl;
server_name example.com www.example.com; # 主域名配置
# 静态资源默认代理
location / {
proxy_pass http://frontend_server; # 前端服务地址
proxy_set_header Host $host; # 透传Host头,确保后端识别真实域名
}
# API域名特殊路由
location /api/ {
if ($host ~* ^(api|admin)\.example\.com$) { # 正则匹配api或admin子域名
proxy_pass http://backend_api; # 后端API服务地址
proxy_set_header X-API-Key "secret"; # 透传API密钥
}
}
}
关键点:
~*表示不区分大小写的正则匹配,避免重复配置不同大小写的域名;proxy_pass后加/与不加/的区别:加/表示后端服务根路径,不加则保留原路径前缀(如/api/→http://backend_api/api/)。
场景三:基于域名的访问控制与响应定制
需求:限制非法域名访问,并为不同域名添加自定义响应头。
配置示例:
server {
listen 443 ssl;
server_name example.com www.example.com;
# 1. 拒绝非法域名访问
if ($host !~* ^(example|www)\.example\.com$) { # 仅允许example.com与www.example.com
return 403 "Access Denied: Unauthorized Domain";
}
# 2. 为不同域名定制响应头
if ($host = 'www.example.com') {
add_header X-Custom-SEO "www-pages"; # 针对www域名优化SEO
}
if ($host = 'example.com') {
add_header X-Custom-SEO "main-domain"; # 针对主域名优化SEO
}
# 3. 静态资源配置
location / {
root /var/www/html;
}
}
关键点:
- 复杂域名匹配用正则表达式(如
^(example|www)\.example\.com$),避免硬编码多个if条件; add_header需放在proxy_pass前执行,确保响应头优先返回,避免被后端服务覆盖。
进阶技巧:替代if的高效域名判断方案
当域名判断条件复杂(如多域名组合、IP+域名匹配)时,直接使用if可能导致性能损耗或逻辑混乱。此时推荐使用Nginx的map或geo模块:
1. map模块:高效多域名映射
map $host $backend_service {
default frontend_server; # 默认映射至前端服务
api.example.com backend_api; # api子域名映射至API服务
admin.example.com backend_admin; # admin子域名映射至管理后台
}
server {
location / {
proxy_pass http://$backend_service; # 动态调用映射结果
}
}
优势:map模块在Nginx启动时预解析配置,性能优于if嵌套,适合高频域名路由场景。
2. geo模块:IP+域名组合判断
geo $allowed {
default 0; # 默认拒绝
192.168.1.0/24 1; # 内网IP允许访问
example.com 1; # 主域名允许访问
}
server {
if ($allowed = 0) {
return 403 "Access Denied";
}
}
优势:支持IP段与域名混合判断,适合基于地理位置或内网/公网的访问控制。
Nginx if指令避坑指南
- 避免循环跳转:若同时配置
www→非www与非www→www跳转,会导致无限重定向,需通过$scheme与$host组合限制条件顺序。 - 变量作用域陷阱:
if在server块中仅执行一次,在location块中可能重复执行,需将条件判断移至server或map中。 - 性能优化:复杂域名匹配(如多正则条件)优先用
map或geo,if嵌套不超过2层,避免影响Nginx处理速度。
总结
Nginx的if指令是域名路由的灵活工具,通过$host变量与正则匹配,可快速实现HTTP→HTTPS跳转、多域名反向代理等场景。但需注意变量作用域与执行顺序,复杂条件建议用map/geo替代。掌握这些技巧,能让服务器配置更精准、更高效,为Web服务的流量管理与安全防护提供有力支撑。
配置验证:修改后需用nginx -t检查语法,通过nginx -s reload生效,避免因变量错误导致服务异常。








