如何提供第一个 Nginx 正则表达式 server_name 服务器

如何提供第一个 Nginx 正则表达式 server_name 服务器

我有一个如下所示的 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):

  1. 确切名称
  2. 以星号开头的最长通配符名称,例如 *.example.org”

  3. 以星号结尾的最长通配符名称,例如“mail.*”

  4. 第一个匹配的正则表达式(按配置文件中出现的顺序)

因此,我的服务器使用正则表达式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;

  ...
}

相关内容