Elimina "www" y redirige a "https" con nginx

Pregunta:

Quiero crear una regla en nginx que haga dos cosas:

  1. Elimina el "www." desde el URI de la solicitud
  2. Redirige a "https" si el URI de la solicitud es "http"

Hay muchos ejemplos de cómo hacer cada una de esas cosas individualmente, pero no puedo encontrar una solución que haga ambas cosas correctamente (es decir, no crea un ciclo de redireccionamiento y maneja todos los casos correctamente).

Necesita manejar todos estos casos:

1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path

Todos estos deberían terminar en https://example.com/path (# 4) sin bucle. ¿Algunas ideas?

Respuesta:

La mejor manera de lograr esto es usando tres bloques de servidor: uno para redirigir http a https, otro para redirigir el nombre www de https a no-www y otro para manejar las solicitudes. La razón para usar bloques de servidor adicionales en lugar de ifs es que la selección del servidor se realiza mediante una tabla hash y es muy rápida. El uso de un if a nivel de servidor significa que se ejecuta el if para cada solicitud, lo cual es un desperdicio. Además, capturar el uri solicitado en la reescritura es un desperdicio, ya que nginx ya tiene esta información en las variables $ uri y $ request_uri (sin y con la cadena de consulta, respectivamente).

server {
    server_name www.example.com example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    ssl_certificate /path/to/server.cert;
    ssl_certificate_key /path/to/server.key;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    ssl_certificate /path/to/server.cert;
    ssl_certificate_key /path/to/server.key;
    server_name example.com;

    <locations for processing requests>
}

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım