Hace algunas semanas tuve un problema con un dominio virtual dentro de nginx, que al entrar con HTTP me enviaba al HTTPS de otro sitio diferente al tecleado, es decir no respetaba estar en el mismo dominio. Debo decir que tengo varios dominios con SSL en la misma dirección IP. El problema es que en cada archivo de sites-enabled de nginx, tenía dos definiciones de server para cada dominio. En una, listaba el puerto 80 y luego mandaba redirección al domino con ssl activado, es decir HTTPS y la definición donde cargaba el certificado.
La solución fue entonces quitar la segunda definición de server y dejar sólo una, añadiendo la siguiente configuración:
^ if ($scheme = http) { return 301 https://$server_name$request_uri; }
de tal forma que cualquier petición hecha al sitio sin el certificado SSL, lo reenvíe de forma permanente al sitio con https. Gracias a eso no se tiene que hacer nada raro en el código de la página, simplemente el servidor lo redirecciona de forma adecuada. Ya si hacemos la prueba vemos la respuesta:
gnu$ curl -Is http://tar.mx HTTP/1.1 301 Moved Permanently Server: nginx Date: Mon, 06 Nov 2017 20:26:31 GMT Content-Type: text/html Content-Length: 178 Connection: keep-alive Location: https://tar.mx/ X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block
Como vemos, al solicitar el nombre del dominio con http me devuelve un Location al sitio que debe mostrar, eso es todo.
https://panchito-kardashian.tar.mx/media/2017/11/forzar-ssl-nginx.png