【问题标题】:nginx: server_name regex and wildcard server_name at the same timenginx: server_name 正则表达式和通配符 server_name 同时
【发布时间】:2018-12-19 13:54:38
【问题描述】:

我对站点的 nginx 配置有问题。
第一个配置使用 wildcard server_name

server {
listen 80;
listen [::]:80;
server_name _;
     return 444;
server_name *.domain.tld;
     return 301 https://$host$request_uri;
}

第二个使用regex server_name 进行反向代理:

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 时,服务器 return 444 。似乎 nginx 对此请求使用 config 1。 我哪里错了?,你能解释或解决吗? 对不起我的英语不好。

【问题讨论】:

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


    【解决方案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$";

    【讨论】:

    • 感谢@Ivan,我会在周末试试这个,我刚刚使用了一个 lua-redis 并扩展为隐藏 server_name 中的端口。你的解释很简洁。
    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2021-05-16
    • 2017-05-05
    • 2013-03-12
    • 2018-07-18
    • 2012-03-16
    相关资源
    最近更新 更多