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 的存取。
我進行了研究並設置了以下配置文件,並以某種方式我能夠控制傳遞給我的代理的 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;
    ...
}

相關內容