使用Nginx将动态顶级域重定向到www子域

使用Nginx将动态顶级域重定向到www子域,nginx,Nginx,我正试图得到它,这样我的Nginx中的任何非子域顶级URL都会被重写到www的子域中 我无法使用正常的服务器名称,因为我有大约20个顶级域指向此服务器。是的,我可以为每一个写一个函数,尽管我可以感觉到我的灵魂开始褪色,只要说出来 我无法创建一揽子规则,因为我在Nginx服务器的其他配置中使用这些顶级域的子域 所以本质上我需要选择example.com/example.co.uk/example.eu/example.ly所有这些都一样,并将它们重定向到它们的www子域,同时确保我只在它们不是子域

我正试图得到它,这样我的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
两次,使得URL
www.www.example.com
我不知道为什么


有人能告诉我发生了什么吗?

如前所述,要么你声明你的子域服务器块,并确保你也在使用一个regex,它位于重定向到www的服务器块之前(regex是按顺序测试的),要么你改进你的regex,使它成为
^[^.]+\(com|co.uk | eu ly)$

编辑:由于您的配置中只允许一个服务器块,因此所有操作都会抛出此唯一的服务器块,因此您至少需要添加:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    return 444;
}

因此,与正则表达式不匹配的头文件将回退到此默认服务器块中,连接将由nginx关闭。然后重新添加您的子域服务器块。

作为接受服务器的升级,我将配置更改为更像:

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;
}
因此,现在当后一个服务器重定向时,它将立即被前一个服务器接收,但第一个服务器不会接收第二个服务器应该接收的内容


我已经对此进行了几次测试,它似乎运行良好。

在配置中如何处理子域?你也在为他们使用一个正则表达式吗?@XavierLucas我已经从我的配置中删除了所有其他服务器,以便自己进行测试。这就是问题所在,因为你的正则表达式也与www.example.com匹配。您需要将子域服务器块放入您的配置中,并确保如果使用正则表达式,它是在您的帖子中声明的(正则表达式是按顺序测试的)。@XavierLucas这样,如果我没有www服务器,服务器名称正则表达式可以匹配www?当然,没有什么可以阻止它:
([^\.].*)
也匹配
www.example
,因为
*
部分。这也会重新访问www.www。明天我将尝试添加一个www服务器块,看看是否有帮助。如果没有,请使用curl(浏览器缓存响应头)进行测试。好的,我会的,我已经清除了chrome、IE、Opera、FF和Safari的缓存,但我会尝试使用Curldes wget缓存,因为我刚刚在那里第一次尝试了它,我看到它执行了3个重定向,一个到www,然后另一个到againHum,您是否让一个默认服务器阻止不匹配的主机头?将
server{listen 80 default_server;}
添加到当前配置中,使其在不同的服务器块中回退。删除包含正则表达式的块中的默认_server指令。