我正试图让它在我的Nginx中的任何非子级顶层URL被重写为www的子域。
我无法使用普通服务器名称的常规技巧,因为我有大约20个指向此服务器的顶级域名。是的,我可以为每个人写一个功能,虽然只要说出来我就能感觉到我的灵魂开始消失。
我无法创建一揽子规则,因为我在Nginx服务器的其他配置中使用这些顶级域的子域。
所以基本上我需要挑选example.com
/ example.co.uk
/ example.eu
/ example.ly
并将它们重定向到他们的www子域名,同时确保我只选择它们不属于子域名。
我到目前为止:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name ~^([^\.].*)\.(com|co.uk|eu|ly)$;
rewrite ^/(.*)$ $scheme://www.$host$request_uri permanent;
}
但是,它会不断添加www
两次,制作网址www.www.example.com
并且我不知道原因。
有人可以告诉我发生了什么吗?
答案 0 :(得分:1)
如上所述,您要么声明子域名服务器块,并确保您是否正在使用正则表达式,它在服务器块重定向到www之前(正则表达式按顺序测试),或者您优化正则表达式,因此它将是{{ 1}}。
编辑:由于您只在配置中放置一个服务器块,所以无论如何都会抛出这个唯一的服务器块,因此您至少需要添加:
^[^.]+\.(com|co.uk|eu|ly)$
因此,与正则表达式不匹配的标题将回退到此默认服务器块,并且连接将由nginx关闭。然后再添加子域服务器块。
答案 1 :(得分:0)
作为接受的进步,我改变了我的配置:
server {
server_name ~^www\.[^.]+\.(com|co.uk|eu|ly)$;
return 444;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name ~^[^.]+\.(com|co.uk|eu|ly)$;
rewrite ^/(.*)$ $scheme://www.$host$request_uri permanent;
}
所以现在当后一个服务器重定向时,它将立即被前一个服务器接收,但第一个服务器将不会接收第二个服务器所应用的内容。
我已经测试了几次这看起来效果很好。