Nginx 流块与子域名通配符过滤

Nginx 流块与子域名通配符过滤

我已经将 Nginx 服务器设置为 L4 代理(带有流模块的正向代理),并在 nginx.conf 文件中进行以下配置;

stream {
resolver 8.8.8.8;
server {
    listen 443;
    ssl_preread on;
    proxy_connect_timeout 5s;
    proxy_pass $ssl_preread_server_name:$server_port;
  } 
}

使用上述配置,一切正常。但是假设我想限制传递到我的代理服务器的 URL 的访问。不是通过限制 IP 地址,而是使用 URL 名称。
我做了研究并设置了以下配置文件,不知何故我能够控制传递到我的代理的 URL。
但问题从这里开始。如果调用一个大型网站,由于它在后台加载了许多链接或子域,并且知道我已经限制了允许传递的 URL,并且通配符子域在流块中不起作用,我无法完全加载请求的网站。
有没有解决方案可以在流块中使用它来支持域的子域的通配符?我的新配置如下:

stream {


 map $ssl_preread_server_name $name {
     ipchicken.com ipchicken.com;
     www.bbc.com www.bbc.com;
     www.bbc.co.uk www.bbc.co.uk;
     bbci.co.uk bbci.co.uk;
}


server {

    resolver 8.8.8.8;
    listen 443;
    ssl_preread on;
    proxy_connect_timeout 5s;
    proxy_pass $name:$server_port;
   }
 }

 events {
}

答案1

您正在寻找hostnames关键字。您可以使用此关键字*.example.com作为域的通配符条目example.com。与server_name指令类似,您可以.example.com同时使用example.com*.example.com

map $ssl_preread_server_name $name {
    hostnames;
    .ipchicken.com    $ssl_preread_server_name;
    .bbc.com          $ssl_preread_server_name;
    .bbc.co.uk        $ssl_preread_server_name;
    .bbci.co.uk       $ssl_preread_server_name;
}

另外,你可以在map块中使用任何正则表达式,即

map $ssl_preread_server_name $name {
    # covers 'bbc.com', 'www.bbc.com' and 'static.bbc.com':
    ~^(?:www\.|static\.)?bbc\.com$    $ssl_preread_server_name;
    ...
}

相关内容