最佳做法:单独进行server
硬编码server_name
nginx的最佳实践是对server
这样的重定向使用单独的名称(不与server
主配置共享),对所有内容进行硬编码,并且完全不使用正则表达式。
如果您使用的是HTTPS,则可能还需要对域进行硬编码,因为您必须预先知道要提供的证书。
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
server_name www.example.org;
return 301 $scheme://example.org$request_uri;
}
server {
server_name example.com example.org;
# real configuration goes here
}
在内部使用正则表达式 server_name
如果您有多个站点,并且不希望获得最高的性能,但是希望每个站点在www.
前缀方面都具有相同的策略,则可以使用正则表达式。使用单独的最佳实践server
仍然有效。
请注意,如果您使用https,则此解决方案会很棘手,因为如果您希望此方法正常运行,则必须具有一个证书来覆盖所有域名。
非www
以www
W /在一个专用的单正则表达式server
的所有网站:
server {
server_name ~^(?!www\.)(?<domain>.+)$;
return 301 $scheme://www.$domain$request_uri;
}
www
www
专用server
于所有站点的非w /正则表达式:
server {
server_name ~^www\.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}
www
www
专用server
于某些网站的非w /正则表达式:
这可能是必要的限制正则表达式覆盖只有一对夫妇域,那么你可以使用这样的事情只匹配www.example.org
,www.example.com
并且www.subdomain.example.net
:
server {
server_name ~^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$;
return 301 $scheme://$domain$request_uri;
}
使用nginx测试正则表达式
您可以测试正则表达式是否可以pcretest
在您的系统上正常工作,这与pcre
您的nginx用于正则表达式的库完全相同:
% pcretest
PCRE version 8.35 2014-04-04
re> #^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$#
data> test
No match
data> www.example.org
0: www.example.org
1: example.org
data> www.test.example.org
No match
data> www.example.com
0: www.example.com
1: example.com
data> www.subdomain.example.net
0: www.subdomain.example.net
1: subdomain.example.net
data> subdomain.example.net
No match
data> www.subdomain.example.net.
No match
data>
请注意,您不必担心尾随点或大小写,因为nginx已经处理了它,根据“主机”标头中包含尾随点的nginx服务器名称regex。
散布if
在现有server
/ HTTPS中:
最终解决方案通常不被视为最佳实践,但是,它仍然可以正常工作。
实际上,如果您使用的是HTTPS,那么最终的解决方案可能最终更易于维护,因为您不必在不同的server
定义之间复制粘贴一堆ssl指令,而只需将代码段放入所需的服务器,从而使调试和维护站点变得更加容易。
非www
到www
:
if ($host ~ ^(?!www\.)(?<domain>.+)$) {
return 301 $scheme://www.$domain$request_uri;
}
www
到非www
:
if ($host ~ ^www\.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}
硬编码单个首选域
如果您希望获得更高的性能以及单个域server
可以使用的多个域之间的一致性,则明确地对单个首选域进行硬编码可能仍然有意义:
if ($host != "example.com") {
return 301 $scheme://example.com$request_uri;
}
参考文献:
Dashboard > Settings > General Settings
并确保www
WordPress地址/站点地址URL中没有任何内容。无论您如何配置nginx,如果在这些URL中都有一个www,它将被重定向到其中带有www的网址。