我有一个如下所示的 Nginx 配置:
server {
server_name sub2.sub1.example.com;
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name sub2.sub1.example.com;
...
}
server {
listen 80;
server_name ~^sub2\.sub1\.example\.com/toto/[abc]/.*$;
...
}
Nginx 文档指出 Nginxserver_names
按以下顺序进行评估(http://nginx.org/en/docs/http/server_names.html):
- 确切名称
以星号开头的最长通配符名称,例如 *.example.org”
以星号结尾的最长通配符名称,例如“mail.*”
- 第一个匹配的正则表达式(按配置文件中出现的顺序)
因此,我的服务器使用正则表达式server_name
将最后评估(事实上,永远不会因为sub2.sub1.example.com
首先匹配而被评估)
有没有办法优先考虑使用正则表达式作为 server_name 的服务器?
default_server 指令可以做到这一点吗?这实际上并不是文档中所说的。
也许我应该使用location
不同的server
指令来解决这个问题?
朱尔斯
答案1
好的,我找到了解决方案。
最好使用一些location
指令来解决这个问题。
所以,现在我的配置是:
server {
listen 80 default_server;
server_name sub2.sub1.example.com;
##### Non HTTPS conf #####
location ~* ^/toto/[abc]/ {
# This replace the "server_name ~^sub2\.sub1\.example\.com/toto/[abc]/.*$;" config block
...
}
##### HTTPS conf #####
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name sub2.sub1.example.com;
...
}