Quiero crear una regla en nginx que haga dos cosas:
- Elimina el "www". de la solicitud URI
- Redirige a "https" si el URI de 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 bucle 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
Todo esto debería terminar en https://example.com/path (# 4) sin bucle. ¿Algunas ideas?
Respuestas:
La mejor manera de lograr esto es utilizando tres bloques de servidor: uno para redirigir http a https, uno para redirigir el nombre https www a no-www y uno 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 nivel de servidor if significa que se ejecuta 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 cadena de consulta, respectivamente).
fuente
https://example.com/
www.sub.example.com
quesub.example.com
y sólo obtener un certificado SSL parasub.example.com
Ahora sé que cheque certificado SSL ocurre antes de la redirección 301, por lo que no puede funcionar. Más explicaciones aquí: serverfault.com/a/358625/144811Esto funciona para mi:
Tenga en cuenta que ambos
yourdomain.com
ywww.yourdomain.com
deben estar en su certificado SSL. Esto es posible con un certificado comodín o con un Nombre alternativo del servidor como se explica aquí . Consulte https://www.startssl.com para obtener certificados agradables y gratuitos que lo hagan. ( Edith : a partir de Chrome versión 56, ya no se confiará en los certificados startssl. Pruebe https://letsencrypt.org/ en su lugar).fuente
include
regla para agregarlo a ambos bloques del servidor SSL.Después de pasar tanto tiempo con cientos de casos similares, se me ocurrió el siguiente fragmento. Es corto y se puede ajustar fácilmente para adaptarse a cualquier cosa.
Si puede ser. Pero existe por una razón, y no debería hacer daño a aquellos que saben cómo usarlo adecuadamente. ;)
fuente
Prefiero volver con un código de respuesta para que el navegador sepa que lo está redirigiendo a otra URL.
entonces otro bloque de configuraciones de servidor para el
https
fuente
¿Qué tal crear un bloque de servidor para este propósito?
luego reiniciando nginx
fuente
https://www.example.com
ahttps://example.com
también.Creo que esto debería funcionar.
En su definición de servidor HTTP simple, se sugiere algo como anthonysomerset, es decir:
Luego, en la definición de su servidor SSL:
De esta forma, la redirección solo debe ocurrir una vez por solicitud, sin importar a qué URL vaya originalmente el usuario.
fuente
if ($host = 'www.example.com') {
embargo, tuve que cambiar tu condicional ya que tu expresión regular no funcionaba para mí. No tengo idea de por qué, ya que parece correcto.Aquí está el ejemplo completo que terminó funcionando para mí. El problema era que no tenía los detalles de SSL (
ssl_certificate
, etc.) en el bloque de redireccionamiento de www. ¡Recuerde revisar sus registros (sudo tail -f /var/log/nginx/error.log
)!fuente