nginx:同时使用server_name正则表达式和通配符server_name

时间:2018-12-19 13:54:38

标签: nginx nginx-reverse-proxy nginx-config

我在使用nginx配置站点时遇到麻烦。
首先配置使用通配符server_name

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;
     }
}

但是当我连接到站点http://www11111.sub.domain.tld时,服务器返回444 。好像nginx对此请求使用配置1。 我在哪里错?,您能解释或解决吗? 对不起,我的英语不好。

1 个答案:

答案 0 :(得分: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;
}

如果您要像处理其他domain.com主机名一样,可以将server_name "~^(?!www\d{4,5}\.\sub\.).*\.domain\.com$";替换为server_name "~^(?!www\d{4,5}\.\sub\.)(?:.*\.)?domain\.com$";

相关问题