Nginx如何无需Lua将主机名子域名中的点替换为横杠
实现方案
纯原生Nginx无需依赖lua等第三方扩展,可通过递归逐次替换子域名中的.实现需求,完整配置如下:
server { listen 443 ssl; listen [::]:443 ssl; # 注意正则中的.需要转义,避免匹配任意字符 server_name "~^(?<prefix>[\w\.]+)\.somedomain\.com$"; set $converted_prefix $prefix; # 每次匹配到第一个.就替换为- if ($converted_prefix ~ "^(?<left>[^.]+)\.(?<right>.*)$") { set $converted_prefix "${left}-${right}"; # 重新进入当前server块逻辑,执行下一次替换 rewrite ^(.*)$ $1 last; } # 所有.替换完成后执行跳转 return 302 $scheme://$converted_prefix.somedomain.com$request_uri; }
注意事项
- Nginx默认rewrite递归上限为10次,可覆盖99%的使用场景,如果你需要处理超过10级的子域名,可在http块中添加
rewrite_recursion_limit 20;(需Nginx 1.19.8及以上版本)调整递归上限。 - 测试阶段建议先用302跳转,确认规则完全符合预期后再改为301永久跳转,避免浏览器缓存错误的跳转规则。
- 原配置中
server_name的正则未对.做转义,可能出现意外匹配,以上配置已修复该问题。
内容的提问来源于stack exchange,提问作者Dubrzr
相关产品推荐
相关产品推荐

