Tengo una página de registro en un subdominio como: https://signup.example.com
Solo debería ser accesible a través de HTTPS, pero me preocupa que la gente pueda tropezar con él a través de HTTP y obtener un 404.
Mi bloque html / server en nginx se ve así:
html {
server {
listen 443;
server_name signup.example.com;
ssl on;
ssl_certificate /path/to/my/cert;
ssl_certificate_key /path/to/my/key;
ssl_session_timeout 30m;
location / {
root /path/to/my/rails/app/public;
index index.html;
passenger_enabled on;
}
}
}
¿Qué puedo agregar para que las personas que van a http://signup.example.com
ser redirigidas https://signup.example.com
? (Para su información, sé que hay complementos de Rails que pueden forzar, SSL
pero esperaba evitar eso)
nginx
ssl
redirect
ruby-on-rails
Callmeed
fuente
fuente
Respuestas:
De acuerdo con las trampas de nginx , es un poco mejor omitir la captura innecesaria, utilizando en su
$request_uri
lugar. En ese caso, agregue un signo de interrogación para evitar que nginx duplique cualquier argumento de consulta.fuente
return 301 http://domain.com$request_uri;
return 301...
causa un error de "demasiados redireccionamientos" mientras el método de reescritura realmente funciona.return 301
funciona, a menos que (supongo) lo esté activando también para las URL correctas, escuchando en ambos puertos (ejemplo de configuración que desencadena el problema: tome la primera respuesta de serverfault.com/a/474345/29689 y omita el if )La mejor manera como se describe en el manual oficial es mediante el uso de la
return
directiva:fuente
301 Moved Permanently
(sus enlaces se han movido permanentemente), así como reescribirproxy_set_header X-Forwarded-Proto https;
listen 443;
en el mismo bloque?Esta es la forma correcta y más eficiente si desea mantener todo en un bloque de servidor:
Todo lo demás anterior, usando "rewrite" o "if ssl_protocol", etc. es más lento y peor.
Aquí es lo mismo, pero aún más eficiente, al ejecutar solo la reescritura en el protocolo http, evita tener que verificar la variable $ esquema en cada solicitud. Pero en serio, es algo tan pequeño que no es necesario separarlos.
fuente
Si está utilizando la nueva definición de servidor dual HTTP y HTTPS, puede utilizar lo siguiente:
Esto parece funcionar para mí y no causa bucles de redireccionamiento.
Editar:
Reemplazado:
con la línea de reescritura de Pratik.
fuente
If you are using the new dual HTTP and HTTPS server definition
entonces deberías separarlo.return 301 https://$server_name$request_uri;
ya que este es el método preferido.Otra variante más, que conserva el encabezado Host: request y sigue el ejemplo "BUENO" en las trampas de nginx :
Aquí están los resultados. Tenga en cuenta que usar en
$server_name
lugar de$host
siempre redirigiría ahttps://site1
.fuente
Note that using $server_name instead of $host would always redirect to https://site1
¿no es eso para lo que$request_uri
sirve?$request_uri
no contiene un host o nombre de dominio. En otras palabras, siempre comienza con un carácter "/".Asegúrese de configurar "seguro" en las cookies, de lo contrario, se enviarán en la solicitud HTTP y podrían ser capturadas por una herramienta como Firesheep.
fuente
Esto funciona mejor, creo. xxxx se refiere a la IP de su servidor. Si está trabajando con Plesk 12, puede hacerlo cambiando el archivo "nginx.conf" en el directorio "/var/www/vhosts/system/domain.tld/conf" para el dominio que desee. No olvide reiniciar el servicio nginx después de guardar la configuración.
fuente
rewrite ^ https://$host$request_uri? permanent;
sería una mejor solución ya que podría tener varios nombres de servidor en unCreo que esta es la solución más simple. Fuerza el tráfico no HTTPS y no WWW a HTTPS y www solamente.
EDITAR - Abr 2018: la solución sin IF se puede encontrar en mi publicación aquí: https://stackoverflow.com/a/36777526/6076984
fuente