redirigir subdominios comodín a https (nginx)

20

Tengo una certificación SSL comodín y estoy tratando de redirigir todo el tráfico que no es SSL a SSL. Actualmente estoy usando lo siguiente para redirigir la url no subdominiada que funciona bien.

server {
listen      80;
server_name mydomain.com;

#Rewrite all nonssl requests to ssl.
rewrite     ^ https://$server_name$request_uri? permanent;
}

cuando hago lo mismo para * .midominio.com, lógicamente redirige a

https://%2A.mydomain.com/

¿Cómo redirige todos los subdominios a su equivalente https?

que que
fuente
2
En lugar de $ server_name, ¿por qué no $ host?
cjc

Respuestas:

47

Eso es todo...

server {
    listen      80;
    server_name *.mydomain.com;

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}
cadmi
fuente
2
Un poco más de explicación podría hacer que esta sea una mejor respuesta.
Dave M
3
@ dave-m, que hay que explicar? $host¿variable? $request_uri?
cadmi
No funciona, todavía tengo https: //%2A.handy.travel/
Damon Yuan
2

La documentación oficial de NGINX alienta a usar la directiva de retorno en lugar de usar la directiva de reescritura para efectuar la redirección. Esto es así, ya que la solicitud que se está reescribiendo no está destinada a ese servidor, pero aún se procesa en ese bloque de servidor. Por lo tanto, las redirecciones se realizan correctamente con una directiva de retorno, ya que se detiene todo el procesamiento y se envía una respuesta de inmediato. NGINX desalienta la reescritura para la redirección aquí: http://nginx.org/en/docs/http/converting_rewrite_rules.html

La sintaxis para la directiva de retorno es: URL del código de retorno; Como originalmente estaba haciendo una reescritura permanente, por lo tanto, puede usar 301 como el código para responder, lo que indica que es una redirección permanente. Su dirección https se pasará en la sección de URL. Referencia: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

Entonces su configuración correcta sería

server {
listen      80;
server_name *.mydomain.com;

#Redirect all nonssl requests to ssl.
return 301 https://$server_name$request_uri;
}

Esto probablemente le permitiría redirigir correctamente a su dominio ssl, con un bloqueo de servidor comodín. También puede probar el nombre de servidor genérico de subrayado '_' o $ host como se sugiere en el comentario anterior. ¡Haznos saber!

Apurva Sukant
fuente
Si bien el uso returnes generalmente mejor, la configuración sugerida no es correcta, ya que todavía usa $ server_name para la redirección, que será "* .midominio.com". La corrección correcta ya fue descrita por @cjc en el comentario anterior, $hostdebe usarse en lugar de $server_name.
Maxim Dounin
Sí, estoy de acuerdo. ¡Ah parece que mi capacidad de atención es una moda!
Apurva Sukant
En lugar de la detracción anterior, permítame ofrecerle una sugerencia con su configuración de SSL que debería mejorar significativamente el rendimiento. La forma más eficiente de configurar SSL si está utilizando un certificado comodín es configurar 'engrapado SSL'. Esto le permite configurar SSL una vez en su servidor predeterminado para todos los subdominios y guarda la autenticación SSL por separado para cada subdominio. ssl_stapling on; resolver 8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify on; Refference- calomel.org/nginx.html
Apurva Sukant
2
Debería serreturn 301 https://$host$request_uri;
scarver2
Estoy escuchando los puertos 80, 8080 y 8181 return 301 https://$server_name$request_uri;para que usen https en el puerto 443. El problema es que la URL redirigida todavía tiene el número de puerto original. 80 no es un problema, pero 8080 aparece comohttps://example.com:8080
A.Grandt
-1

Intenta algo como esto:

server {
  listen 80;
  server_name ~^(.*)\.mydomain\.com$;
  set $servername $1;
  rewrite ^(.*)$ https://$servername.mydomain.com/$1;
}

El truco es definir el servidor comodín y hacer redirecciones basadas en su nombre.

Andrei Mikhaltsov
fuente
Grupo de expresiones regulares demasiado permisivo.
Kzqai