Я хотел бы перенаправить все запросы, поступающие извне сети, на https, но оставить внутренние запросы на http.
Сейчас у меня есть два .conf
файла — один из них начинается так:
server {
# listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
server_name www.example.com , example.com;
# omitted stuff
}
и содержит
server {
listen 80;
server_name www.example.com , example.com;
return 301 https://$host$request_uri;
}
и еще один, который начинается так:
server {
listen 192.168.1.144:80;
listen 192.168.1.196:80;
server_name "";
root /var/www/html;
# omitted stuff
}
Но сейчас запросы наhttp://example.comне перенаправляются на https.
Почему так? В чем моя ошибка? Моя цель — перенаправить все запросы, не поступающие из домашней частной сети ( 192.168.1.*
), на https, а внутренние оставить в покое.
решение1
server_name
директива использует пробелы для разделения доменных имен. В вашей конфигурации есть запятые, что сбивает с толку nginx.
Вам необходимо использовать:
server_name www.example.com example.com;
решение2
Я предполагаю, что с помощью следующего кода вы пытаетесь создать другой блок сервера, который прослушивает два интерфейса в локальной сети:
server {
listen 192.168.1.144:80;
listen 192.168.1.196:80;
# ...
}
Чтобы это работало, ваша топология должна выглядеть примерно так:
Однако, если ваш сервер находится за тем же NAT, что и клиенты в частной сети 192.168.1.0/24
, этот server
блок будет использоваться и для внешних подключений. Эта топология будет похожа на эту:
В последнем случае вы можете использовать, например,ngx_http_geo_moduleдля разделения локальной сети по ее клиентам:
geo $external {
default 1;
192.168.1.0/24 0;
}
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
if ($external) {
return 301 https://$server_name$request_uri;
}
}
Однако с точки зрения безопасности я бы не рекомендовал доверять вашей внутренней сети таким образом, а использовать TLS одинаково для каждого клиента. Это потому, что легко получить позицию MitM, просто имея доступ к локальной сети.
решение3
Попробуйте это для перенаправления, а для внутреннего использования я лично предпочитаю создавать имя сервера по IP-адресу.
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/ssl/example.crt;
ssl_certificate_key /etc/ssl/example.key;
server_name example.com www.example.com;
location{
.......
}
}