Me gustaría redirigir todas las solicitudes provenientes de fuera de la red a https, pero mantener las internas en http.
En este momento tengo dos .conf
archivos, uno que comienza así:
server {
# listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
server_name www.example.com , example.com;
# omitted stuff
}
y contiene
server {
listen 80;
server_name www.example.com , example.com;
return 301 https://$host$request_uri;
}
y otro que empieza así:
server {
listen 192.168.1.144:80;
listen 192.168.1.196:80;
server_name "";
root /var/www/html;
# omitted stuff
}
Pero ahora mismo solicitahttp://ejemplo.comno sea redirigido a https.
¿Porqué es eso? ¿Qué me he equivocado? Mi objetivo es redirigir todas las solicitudes que no provienen de la red privada doméstica ( 192.168.1.*
) a https y dejar las internas en paz.
Respuesta1
server_name
La directiva utiliza espacios para separar nombres de dominio. Su configuración tiene comas, lo que confunde a nginx.
Necesitas usar:
server_name www.example.com example.com;
Respuesta2
Supongo que con lo siguiente estás intentando crear un bloque de servidor diferente que escuche en dos interfaces de la red local:
server {
listen 192.168.1.144:80;
listen 192.168.1.196:80;
# ...
}
Para que esto funcione, su topología sería similar a esta:
Sin embargo, si su servidor utiliza el mismo NAT que los clientes de la red privada 192.168.1.0/24
, este server
bloque también se utilizará para las conexiones externas. Esta topología sería similar a esta:
Con este último, podrías usar, por ejemplo, elngx_http_geo_modulepara separar la red local en función de sus clientes:
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;
}
}
Sin embargo, desde la perspectiva de la seguridad, no recomendaría confiar en su red interna de esta manera, sino usar TLS por igual para cada cliente. Esto se debe a que es fácil conseguir una posición en MitM simplemente teniendo acceso a la red local.
Respuesta3
Pruebe esto para la redirección y, para la redirección interna, personalmente prefiero hacer el nombre del servidor por dirección 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{
.......
}
}