nginx:同时使用server\u name regex和通配符server\u name

nginx:同时使用server\u name regex和通配符server\u name,nginx,nginx-reverse-proxy,nginx-config,Nginx,Nginx Reverse Proxy,Nginx Config,我对站点的nginx配置有问题。 第一次配置使用通配符服务器名称: server { listen 80; listen [::]:80; server_name _; return 444; server_name *.domain.tld; return 301 https://$host$request_uri; } 第二种方法是使用regex服务器名称来反向代理: server { listen 80; listen [::]

我对站点的nginx配置有问题。
第一次配置使用通配符服务器名称:

server {
listen 80;
listen [::]:80;
server_name _;
     return 444;
server_name *.domain.tld;
     return 301 https://$host$request_uri;
}
第二种方法是使用regex服务器名称来反向代理:

server {
     listen      80;
     listen      [::]:80;
     server_name    ~^www(?<port>\d{4,5}+)\.sub\.domain\.tld$;
     location / {
            proxy_pass        http://127.0.0.1:$port;
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  Host $host;
     }
}
服务器{
听80;
听[:]:80;
服务器名称~^www(?\d{4,5}+).sub\.domain\.tld$;
地点/{
代理通行证http://127.0.0.1:$port;
代理集头X-Real-IP$remote\u addr;
代理设置头主机$Host;
}
}
但当我连接到站点时,服务器返回444。似乎nginx使用配置1来处理这个请求。 我错在哪里?你能解释或解决吗?
很抱歉我的英语不好。

您的通配符服务器名将始终优先于您的正则表达式服务器名。您可以尝试以下配置:

server {
    listen 80;
    listen [::]:80;
    server_name "~^www(?<port>\d{4,5}+)\.sub\.domain\.com$";
    location / {
        proxy_pass        http://127.0.0.1:$port;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  Host $host;
    }
}

server {
    listen 80;
    listen [::]:80;
    # using negative regex assertion with the server_name directive
    server_name "~^(?!www\d{4,5}\.\sub\.).*\.domain\.com$";
    return 301 https://$host$request_uri;
}

server {
    listen 80;
    listen [::]:80;
    # catch all other host names
    server_name _;
    return 444;
}
服务器{
听80;
听[:]:80;
服务器名称“^www(?\d{4,5}+)”子域名“.com$”;
地点/{
代理通行证http://127.0.0.1:$port;
代理集头X-Real-IP$remote\u addr;
代理设置头主机$Host;
}
}
服务器{
听80;
听[:]:80;
#将负正则表达式断言与server_name指令一起使用
服务器名称“~^(?!www\d{4,5}\.\sub\..\.domain\.com$”;
返回301 https://$host$request\u uri;
}
服务器{
听80;
听[:]:80;
#捕获所有其他主机名
服务器名称;
返回444;
}

如果您想像其他主机一样处理
domain.com
hostname,您可以替换
server\u name“~^(?!www\d{4,5}\.\sub\).\.domain\.com$”使用
服务器名“~^(?!www\d{4,5}\.\sub\)(?:.*\)?domain\.com$”

谢谢@Ivan,我会在周末试试这个,我刚刚使用了一个lua redis,扩展到服务器名称中隐藏端口。你的解释很简洁。