【问题标题】:Nginx Replace characters in hostnameNginx 替换主机名中的字符
【发布时间】:2021-10-23 17:50:10
【问题描述】:
我有这样的网址:
我希望 nginx 替换点“。”主机名的子域部分中的字符由破折号“-”表示,因此这将导致:
我已经有一个服务器块,可以在“前缀”变量中捕获带有点的 url,但是我找不到任何关于如何重写 url 的文档,以便在不使用 lua/...的情况下替换“前缀”中的字符。 :
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name "~^(?<prefix>[\w\.]+).somedomain.com$";
rewrite 302 "$scheme://What do i put in here?.somedomain.com$request_uri";
}
非常感谢愿意为此提供帮助的人们!
【问题讨论】:
标签:
nginx
redirect
replace
url-rewriting
hostname
【解决方案1】:
使用地图捕获子域:
map $host $resub {
~^([^.]+)\.([^.]+)\.somedomain\.com$ $1-$2;
~^([^.]+)\.([^.]+)\.([^.]+)\.somedomain\.com$ $1-$2-$3;
~^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)\.somedomain\.com$ $1-$2-$3-$4;
~^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)\.somedomain\.com$ $1-$2-$3-$4-$5;
# etc.
}
server {
server_name *.somedomain.com;
if ($resub) {
return 302 $scheme://$resub.somedomain.com$request_uri;
}
}
【解决方案2】:
您可以使用单独的捕获来捕获. 的两侧,例如:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name ~^([^.]+)\.([^.]+)\.([^.]+)\.example\.com$;
...
return 302 $scheme://$1-$2-$3.example.com$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name ~^([^.]+)\.([^.]+)\.example\.com$;
...
return 302 $scheme://$1-$2.example.com$request_uri;
}