我试图让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; } } }