Nginx将所有www.domainredirect到域,并将所有域redirect到www.domain

我试图让nginx通过添加或删除www来redirect从任何域收到的每个请求。 字首。

这是一个小redirect服务。 如果你指向www.any.domain,它应该将www.any.domain / *redirect到any.domain / *。 如果你指向任何.domain,它应该redirectany.domain / *到www.any.domain / *。

这在实践中不会导致redirect循环,因为这两个域(any.domain或www.any.domain)中只有一个会指向这个服务。 另一个到另一台服务器上的您的网站。

这应该适用于任何域。 数以千计的不同的,所以它必须有一个正则expression式通配符匹配。 事实上,互联网上的任何东西都可以指向它,这不是nginx的担心,因为这将在上面/之前的一层处理。 每一个带有HTTP_HOST头部的请求都会有一个www或者没有,在这两种情况下都应该被redirect,所以服务器应该redirect它接收的所有请求。

域名不以www开头的情况。 很容易,但我不知道如何捕捉它开始与www的情况。 然后只使用域的其余部分。

我试过search,但是a)几乎没有人同时redirect,b)大多数人只关心一个领域,所以他们硬编码和c)一旦你过去,人们往往吟唱“如果是邪恶”。 所以这并没有什么帮助。

这是我现在所拥有的:

http { server { listen 80 default_server; server_name _; # add www. to URLs that don't start with it. if ($host !~* ^www\.) { rewrite ^(.*)$ http://www.$host$1 permanent; } # but what about URLs that DO start with www.? How do I remove it? } } 

这用于为您的网站设置DNS。 如果您希望您的网站在mydomain.com上投放,请将mydomain.com指向您的网站,并将www.mydomain.com指向此redirect器。 如果您希望在www.mydomain.com上投放您的网站,请将www.mydomain.com指向您的网站,并将mydomain.com指向此redirect器。

使用两个服务器块

这实际上是在文档中 :

命名的正则expression式捕获可以稍后用作variables:

 server { server_name ~^(www\.)?(?<domain>.+)$; location / { root /sites/$domain; } } 

应用于问题中的用例,所需要的服务器块是:

 server { server_name ~^(www\.)(?<domain>.+)$; return 301 $scheme://$domain$request_uri; } 

把它放在一起

该问题所需的完整服务器configuration将是:

 server { listen 80; server_name ~^(www\.)(?<domain>.+)$; return 301 $scheme://$domain$request_uri; } server { listen 80 default_server; return 301 $scheme://www.$host$request_uri; } 

通过这种方式,configuration非常简单,没有if (通常应该避免 )的用法。

类似的,没有testing,但沿着这些线:

 http { server { listen 80 default_server; server_name _; # redirect www.foo.com -> foo.com if ($host ~* ^www\.) { rewrite ^www\.(.*)$ http://$1 permanent; } } } 

看起来像我在https://blog.engineyard.com/2011/useful-rewrites-for-nginxfind解决scheme

 http { server { listen 80 default_server; server_name _; if ($host !~* ^www\.) { rewrite ^(.*)$ $scheme://www.$host$1 permanent; break; } if ($host ~* ^www\.(.*)) { set $host_without_www $1; rewrite ^(.*)$ $scheme://$host_without_www$1 permanent; break; } } }