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

时间:2014-11-23 23:11:19

标签: nginx

我正试图让它在我的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并且我不知道原因。

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

2 个答案:

答案 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;
}

所以现在当后一个服务器重定向时,它将立即被前一个服务器接收,但第一个服务器将不会接收第二个服务器所应用的内容。

我已经测试了几次这看起来效果很好。