我想要访问以下服务器名称, https :
example.com
test.example.com
api.example.com
api.test.example.com
# And I might add more, all on example.com of course
# ...
我想将所有http
,http://www
和https://www
重定向到https://non-www
像:
http://example.com => https://example.com
http://test.example.com => https://test.example.com
http://api.example.com => https://api.example.com
http://api.test.example.com => https://api.test.example.com
http://www.example.com => https://example.com
http://www.test.example.com => https://test.example.com
http://www.api.example.com => https://api.example.com
http://www.api.test.example.com => https://api.test.example.com
https://www.example.com => https://example.com
https://www.test.example.com => https://test.example.com
https://www.api.example.com => https://api.example.com
https://www.api.test.example.com => https://api.test.example.com
看一下我在网上找到的一个简单例子,我尝试了以下内容:
server {
listen 80;
server_name example.com test.example.com www.example.com www.test.example.com api.example.com api.test.example.com www.api.example.com www.api.test.example.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443;
server_name www.example.com www.test.example.com www.api.example.com www.api.test.example.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443;
server_name example.com test.example.com api.example.com api.test.example.com;
#
# The rest of the config that that follows is indeed for the names
# that I want to redirect everything to
# ...
}
我认为$host
表示/
之前和没有www
之前的网址部分。
就像我访问www.api.test.example.com
一样, $ host 就是api.test.example.com
。等等。
但是,在注意到它的行为方式和检查Nginx变量之后,似乎我认为错了。虽然它没有非常清楚地解释并且没有提供示例,但它们也没有说明使用哪个变量来获得没有www的完整域(包含子域)。
答案 0 :(得分:2)
有多种方法可以执行此操作,但如果此服务器仅处理example.com
的子域,则可以使用正则表达式和默认服务器进行简化,而不是为server_name
指定长列表指令。
例如:
server {
listen 80;
listen 443 ssl;
server_name ~^www\.(?<domain>.+)$;
return 301 https://$domain$request_uri;
}
server {
listen 80 default_server;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl default_server;
...
}
第一个server
块仅匹配以www.
开头的主机名。第二个服务器块使用http
匹配其他所有内容。第三个server
块使用https
匹配其他所有内容。
假设此服务器具有通配符证书,对所有子域都是通用的。有关详情,请参阅this document。