Nginx:将所有的wwwtrafficeredirect到非www版本

如何在www上redirect请求 到非www版本?

这应该包括对根域以及任何(通配符)子域的请求。

我也不想要任何不必要的if语句,按照nginx的陷阱文档。

这是我迄今为止,但它似乎只适用于根域,而不是subdoamins。

server { listen 80 default_server; server_name www.*; rewrite "^www\.(.*)" $scheme://$1 permanent; } 

我对你的问题的理解如下:以合理的一般方式将到达任意根域的任何子域的所有请求redirect到根域。 例如:

  • http://www.example1.com – > example1.com
  • abcd.example2.com – > example2.com
  • * .exampleN.com – > exampleN.com

我们先从简单的案例开始 – 一个已知的根域,任何子域:

 server{ server_name *.example.com; rewrite ^ $scheme://example.com permanent; } server{ listen 80 default_server; server_name example.com; #your main config } 

这是相当不错的优化 – 没有如果语句,在重写没有不必要的捕获 – 通配符server_names散列性能。 第一个服务器块匹配任何子域,并将发出一个redirect到第二个服务器块,只匹配根域。 (注意,尽pipe在一个服务器块( server_name .example.com – no * server_name .example.com )中很容易匹配两个条件,但是需要两个服务器块来防止redirect循环)。

更广义的情况需要某种方法来识别域,因为它是“未知的”。 因此,我们需要parsingserver_name – 并可以通过正则expression式捕获来完成。

 server{ server_name ~^(.+\.)(?<domain>.+\..+)$; rewrite ^ $scheme://$domain permanent; } server{ listen 80 default_server; server_name _; #your main config } 

这里我们有一个(必填的)子域 – (.+\.)表示任何字符( . )重复一次或多次( + )后跟一个实际的'。' (用反斜线转义) – 如果我们需要这个捕获将被分配到$1

下一节非常相似 – 我们使用Perl 5.1 / PCRE7符号来命名捕获 – ?<domain>将捕获分配给$domain 。 我们的域可以是任何( . )长度( + )的一个或多个字符,然后是一个实际的“。”。 然后是另一组任何字符(TLD)。 这个正则expression式不适用于包含'。'的TLD。 – 例如'co.uk' – 如果您要使用这些,最好在您的正则expression式中指定有效的顶级域名(TLD)。 例如:

 server_name ^(.+\.)(?<domain>.+\.(co\.uk|net|org|com))$ 

我们使用与上面相同的重写,只是用捕获的域replace静态根域。

由于“未知”域scheme的常见情况将会看到您将相同的文件传递到所有域,因此您可能不需要捕获default_server块中的域名(在可能的情况下避免使用正则expression式会更有效) 。

请注意,正则expression式匹配具有最低的优先级 – 确切的名称,通配符优先于正则expression式。 另外,与精确名称和通配符不同,正则expression式不被散列。 最后,在使用正则expression式和捕获时,即使只定义了一个服务器块,也必须对每个请求评估expression式以获取捕获。

由于上述原因,如果您必须针对特定的域名做一些特定的事情,只需为其定义一个新的服务器块,并且将优先于上面定义的default_server块。

如果您知道域名,即使它们很多,如果您可以包含静态名称而不是使用正则expression式,您将获得更好的性能。 也就是说,有些情况下(例如,允许用户将你的IP作为服务的一部分指向他们的(未知的)域名),你可能不知道该域名以及正则expression式的必要位置。

(当然,这需要一个匹配的通配符DNS条目来请求到达服务器。)

有几种方法可以做到这一点。 为www.servername.org域名设置一个configuration文件,并为其指定一个通用的servername.orgredirect或者添加以下到你的configuration而不是你的重写行。

 if ($host = 'www.site.com' ) { rewrite ^/(.*)$ http://site.com/$1 permanent; } 

把事情简单化。

  server { listen 80; server_name nginx.org www.nginx.org www1.nginx.org; ... } 

http://nginx.org/en/docs/http/server_names.html

更好的是

  server { listen 80; server_name *; ... } 

或者这太简单了?