You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nginx的server_name中配置多动态变量匹配子域名?

解决Nginx server_name匹配多动态变量的问题

嘿,这个场景我之前刚好处理过,给你支个靠谱的招~因为第三方不支持动态GET参数,想用自定义子域名带多变量的方式实现需求,Nginx的正则表达式匹配完全能搞定,比通配符灵活太多,还能直接捕获变量复用。

核心思路

Nginx的server_name支持正则表达式(需要加~前缀标记),我们可以用正则捕获组提取子域名里的多个动态变量,之后就能在配置里直接调用这些变量做后续处理。

匹配两个动态变量的配置示例

server {
    listen 80;
    # 正则规则:匹配固定前缀+两个下划线分隔的变量+固定域名后缀
    server_name ~^someSecretUrl_([^_]+)_([^_]+)\.example\.com$;
    
    # 把正则捕获的组赋值给自定义变量,方便后续调用
    set $variable1 $1;
    set $variable2 $2;
    
    # 这里可以根据需求处理请求,比如转发给第三方服务
    location / {
        # 示例:把捕获的变量转成GET参数传给第三方
        proxy_pass http://third-party-service.com?variable1=$variable1&variable2=$variable2;
        proxy_set_header Host third-party-service.com;
        # 其他必要的proxy配置(比如超时、请求头传递等)
    }
}

正则规则拆解

  • ~^:标记这是正则匹配的server_name,且强制从字符串开头匹配,避免误匹配无关域名
  • someSecretUrl_:匹配你指定的固定前缀
  • ([^_]+):捕获第一个动态变量,[^_]表示匹配除下划线外的所有字符,+确保变量至少有一个字符,完美对应下划线分隔的变量格式
  • 第二个([^_]+):捕获第二个动态变量,逻辑和第一个一致
  • \.example\.com$:匹配固定域名后缀,$确保匹配到域名结尾,避免部分匹配

扩展到三个动态变量

如果需要三个变量,只需要调整正则和变量赋值即可:

server {
    listen 80;
    server_name ~^someSecretUrl_([^_]+)_([^_]+)_([^_]+)\.example\.com$;
    
    set $variable1 $1;
    set $variable2 $2;
    set $variable3 $3;
    
    # 后续请求处理逻辑...
}

关键注意事项

  • DNS泛解析:要确保你的域名配置了泛解析(比如*.example.com指向你的Nginx服务器),这样所有符合格式的子域名都能解析到Nginx
  • 优先级问题:正则匹配的server_name优先级比精确匹配、通配符匹配低,如果有其他server块可能和这个规则冲突,建议把这个server块放在配置文件的后面,或者调整server_name_hash_bucket_size(如果出现哈希冲突报错)
  • HTTPS场景:如果用HTTPS,需要配置通配符SSL证书(比如*.example.com),否则每个子域名都要单独证书,完全违背你不想单独创建子域名的初衷

测试方法

可以用curl模拟请求验证:

curl -H "Host: someSecretUrl_test1_test2.example.com" http://你的Nginx服务器IP

查看Nginx日志或者第三方服务的请求记录,确认变量是否被正确捕获和传递。

内容的提问来源于stack exchange,提问作者vasilevich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:11:48