如何为Nginx配置特定子域名及对应路径的定向跳转规则
配置方案
你可以直接在原有server块中新增跳转规则,不会影响其他请求的原有处理逻辑,参考配置如下:
server { listen 80 default_server; listen [::]:80 default_server; server_name ~^(?P<sub>.+)\.(example1|example2)\.com$; root /var/www/instances/$sub; # 新增跳转规则 if ($host = 'sub1.example1.com') { # 匹配/wiki/0/前缀的路径跳转 rewrite ^/wiki/0/(.*)$ https://newSub1.example1.com/wiki/0/$1 permanent; # 匹配/wiki/20/前缀的路径跳转 rewrite ^/wiki/20/(.*)$ https://newSub2.example1.com/wiki/0/$1 permanent; } # 原有其他配置保持不变 ... }
规则说明
- 仅当请求的Host头为
sub1.example1.com时才会触发两条重写规则,其他子域名的请求完全不受影响 - 重写规则中的
(.*)会捕获前缀之后的所有路径内容作为$1,拼接到目标URI之后,保留原始的$path部分 - 示例中使用
permanent返回301永久跳转,如果你需要临时跳转,替换为redirect即可返回302状态码 - 所有不匹配两个前缀路径的
sub1.example1.com请求,会继续走原有配置的站点逻辑,不需要额外调整
优化方案(可选)
如果你希望规避Nginx中if指令潜在的执行逻辑问题,也可以采用性能更优的map方案,配置如下:
首先在Nginx的http配置块中新增map映射规则:
http { # 原有http层级其他配置保持不变 ... map $host$request_uri $redirect_target { default ""; ~^sub1\.example1\.com/wiki/0/(.*)$ newSub1.example1.com/wiki/0/$1; ~^sub1\.example1\.com/wiki/20/(.*)$ newSub2.example1.com/wiki/0/$1; } server { listen 80 default_server; listen [::]:80 default_server; server_name ~^(?P<sub>.+)\.(example1|example2)\.com$; root /var/www/instances/$sub; # 新增跳转逻辑 if ($redirect_target != "") { rewrite ^ https://$redirect_target permanent; } # 原有server层级其他配置保持不变 ... } }
内容的提问来源于stack exchange,提问作者Hans-Helge
相关产品推荐
相关产品推荐

