
Я настроил сервер 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;
...
}