我已经将 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;
...
}