Nginx: forzar SSL en una ruta, no SSL en otras


27

¿Cómo configuro el archivo conf de Nginx para forzar SSL en solo una de las rutas en mi sitio y no SSL en el resto?

Por ejemplo, quiero que todas las URL en / user sean https, pero el resto de las URL sean http.

Para la primera parte tengo:

rewrite ^/user(.*) https://$http_host$request_uri?;

No quiero usar "si". Supongo que aprovecharía el orden de operación, pero no quiero terminar en un bucle.

Respuestas:


38

En su configuración nginx, debe tener dos áreas de "servidor". Uno para el puerto 80 y otro para el puerto 443 (no SSL y SSL). Simplemente agregue una ubicación en su sitio web que no sea SSL para redirigir a su página SSL.

server {
    root /var/www/
    location / {
    }
    location /user {
        rewrite ^ https://$host$request_uri? permanent;
    }
}

reenviará todo el tráfico que termina en / usuario a su https: // servidor.

Luego, en su servidor 443, usted hace lo contrario.

server {
    listen 443;
    root /var/www/
    location / {
        rewrite ^ http://$host$request_uri? permanent;
    }
    location /user {
    }
}

2
Este enfoque es bueno, pero cae en un par de trampas comunes , específicamente "Rootear dentro del bloque de ubicación" y "
Reescritura de

1
Yo edité. ¿Se ve bien? También saqué listen 80 y agregué http_host.
pbreitenbach

Con esta configuración, la conexión cambia de / a ssl / non-ssl cuando un usuario navega por las páginas del sitio, ssl para las URL iniciadas /usery no ssl para todas las demás urls. Como resultado, incluso el usuario escribe explícitamente https://www.example.com/en la barra de direcciones del navegador, la página resultante es http://www.example.com/. ¿Hay alguna manera de implementar la reescritura automática de url entre ssl / non-ssl como se logra mediante la configuración descrita en esta respuesta, pero aún así respetar la solicitud ssl explícita si el usuario la escribe explícitamente en la barra de direcciones? ¡Gracias!
adiós

@goodbyeera, sí. Si la idea es obligar a los usuarios a usar SSL en ciertas áreas, podemos anular sus protocolos allí pero honrarlos en cualquier otro lugar simplemente eliminando los comandos de reescritura de la configuración del servidor 443. Por supuesto, ahora cuando van a una parte segura, seguirán navegando con SSL cuando vayan a otro lugar, pero les permite a las personas elegir usar SSL desde el principio.
Chuck se seca el

13

Nginx permite procesar tanto HTTP como HTTPS dentro del mismo serverbloque. Por lo tanto, no tiene que duplicar las directivas para ambos y puede redirigir la ruta que desea proteger

server {
  listen 80 default_server;
  listen 443 ssl;
  ... ssl certificate and other configs ...

  location /user {
    if ($scheme = 'http') {
      rewrite ^ https://$http_host$request_uri? permanent;
    }
  }

  ... your basic configuration ...
}

Asegúrese de no poner ssl onlínea allí porque romperá HTTP simple.

Opcionalmente, puede redirigir todas las demás solicitudes de HTTPS a HTTP de la misma manera:

if ($scheme = 'https') {
  rewrite ^ http://$http_host$request_uri? permanent;
}

ACTUALIZACIÓN : como Alexey Ten señala amablemente en la sección de comentarios, verificar schemecada solicitud no es una idea muy brillante. Debe seguir la forma declarativa de configurar su nginx. En este caso, declare dos bloques de servidor con redireccionamientos location, mueva la lógica común a un archivo separado y includeen ambos. Entonces la respuesta de GruffTech es mejor.


2
Es ineficaz hacer un esquema de verificación nginx para cada solicitud.
Alexey Ten

1
Sé que la pregunta fue respondida hace 3 años, pero la encontré mientras luchaba por hacer lo que gradualmente hice y solo quería compartir mis resultados con las personas que seguirán mis pasos.
Hnatt

1
Bueno, deberías leer wiki.nginx.org/IfIsEvil
Alexey Ten

1
@AlexeyTen, ¿no es el caso "cuando no puedes evitar usar un if"? ¿Hay alguna otra forma de tener la misma configuración para HTTP y HTTPS sin duplicar directivas?
Hnatt

2
Usar includedirectiva para directivas comunes. Alguna duplicación está bien.
Alexey Ten
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.