假设我有多个域名变体,其中一个品牌在多个顶级域名注册;并且它们都需要转到一个特定域名+附加与最初请求的域名相关的专用自定义 uri。
例如我有:
- 域名.tld
- 域名.net
- 域名.org
- 域名.com
在哪里域名.com所有请求都需要在附加额外的 uri 后到达,如下所示:
- 域名.com/tld
- 域名.com/net
- 域名.com/org
我想出了这个工作设置:
# (www.)domain.tld
server {
listen 80;
server_name domain.tld www.domain.tld;
return 301 $scheme://www.domain.com/tld$request_uri;
}
# (www.)domain.net
server {
listen 80;
server_name domain.net www.domain.net;
return 301 $scheme://www.domain.com/net$request_uri;
}
# (www.)domain.org
server {
listen 80;
server_name domain.org www.domain.org;
return 301 $scheme://www.domain.com/org$request_uri;
}
# (www.)domain.com
server {
listen 80;
server_name domain.org www.domain.org;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend.host:port;
}
}
但声明多个服务器块虽然合乎逻辑,但看起来过于冗长。
总结 有没有办法实现这种重定向,而不必定义服务器为每个域设置块?
答案1
正则表达式server_name
指令可以捕获域名的最后一个元素以用于重定向。例如:
server {
listen 80;
server_name ~\.(?<tld>[^.]+)$;
return 301 $scheme://www.domain.com/$tld$request_uri;
}
看这个文件了解详情。