
我已經將 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;
...
}