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.comser redirigidas https://signup.example.com? (Para su información, sé que hay complementos de Rails que pueden forzar, SSLpero 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_urilugar. 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 301funciona, 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
returndirectiva: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 definitionentonces 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_namelugar de$hostsiempre 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_urisirve?$request_urino 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