最佳实践:单独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
的专用单中的非w/ 正则表达式:server
server {
server_name ~^www\.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}
www
仅在某些站点专用于非www
w/ 正则表达式:server
可能有必要将正则表达式限制为仅涵盖几个域,然后您可以使用类似这样的内容仅匹配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 测试正则表达式
您可以测试正则表达式在您的系统上是否按预期工作,这与您的 nginx 将用于正则表达式的库pcretest
完全相同:pcre
% 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 服务器名称正则表达式,当“主机”标头有一个尾随点时。
撒if
在现有server
/HTTPS 中:
这个最终解决方案通常不被认为是最佳实践,但是,它仍然有效并且可以完成工作。
事实上,如果您使用的是 HTTPS,那么最终的解决方案可能最终更易于维护,因为您不必在不同定义之间复制粘贴一大堆 ssl 指令server
,而可以只将代码片段放入所需的服务器,从而更容易调试和维护您的站点。
非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;
}
参考: