![如何提供第一个 Nginx 正则表达式 server_name 服务器](https://linux22.com/image/654655/%E5%A6%82%E4%BD%95%E6%8F%90%E4%BE%9B%E7%AC%AC%E4%B8%80%E4%B8%AA%20Nginx%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%20server_name%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我有一个如下所示的 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;
...
}