2014-11-23 127 views
1

我试图获得它,以便我的Nginx中的任何非子域名顶级URL都被重写为www的子域名。使用Nginx将动态顶级域名重定向到www子域

因为我有大约20个指向这个服务器的顶级域名,所以我不能使用正常的服务器名称。是的,我可以为每个人写一个功能,但我可以感觉到我的灵魂开始褪色,只是说出来。

因为我在Nginx服务器的其他配置中使用这些顶级域的子域,所以我无法创建一揽子规则。

所以基本上我需要pickout 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,我不知道为什么。

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

+0

你在你的配置中如何处理子域名?你也使用一个正则表达式吗? – 2014-11-23 23:25:14

+0

@XavierLucas我已将所有其他服务器从我的配置中取出来自行测试 – Sammaye 2014-11-23 23:30:40

+0

所以这就是问题所在,因为您的正则表达式也与www.example.com相匹配。您需要将子域服务器块放入您的配置中,并确保(如果使用正则表达式)在发布之前声明了它(顺序测试正则表达式)。 – 2014-11-23 23:32:35

回答

1

正如所讨论的,要么你声明你的子域服务器块,并确定你是否也使用正则表达式,它是在服务器块重定向到www之前(正则表达式是按顺序测试的),或者你优化你的正则表达式,因此它将是^[^.]+\.(com|co.uk|eu|ly)$

编辑:你只在你的配置让一台服务器模块,一切都会反正抛出这一独特的服务块,所以你至少需要补充:

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

所以标题不匹配正则表达式将回退到这个默认的服务器模块,连接将被nginx关闭。然后添加您的子域服务器块。

+0

这也回到www.www。我会尝试明天添加一个www服务器块,看看是否有帮助 – Sammaye 2014-11-23 23:40:36

+0

不,它没有,用curl(浏览器缓存响应头文件)测试它。 – 2014-11-23 23:41:25

+0

好吧,我已经清除了Chrome,IE,Opera,FF和Safari的缓存,但我会试着用卷曲 – Sammaye 2014-11-23 23:41:49

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

所以现在,当后者服务器重定向它会立即通过现有服务器,但拿起第一台服务器不会皮卡第二个应该是什么。

我已经测试了几次,它似乎运作良好。

相关问题