Tengo una aplicación en funcionamiento en heroku con express en el nodo con https. ¿Cómo identifico el protocolo para forzar una redirección a https con nodejs en heroku?
Mi aplicación es solo un servidor http simple, (todavía) no se da cuenta de que heroku le está enviando solicitudes https:
/* Heroku provides the port they want you on in this environment variable (hint: it's not 80) */
app.listen(process.env.PORT || 3000);
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })
Respuestas:
A partir de hoy, 10 de octubre de 2014 , usando la pila Heroku Cedar y ExpressJS ~ 3.4.4 , aquí hay un conjunto de código de trabajo.
Lo principal para recordar aquí es que ESTAMOS implementando en Heroku. La terminación de SSL ocurre en el balanceador de carga, antes de que el tráfico cifrado llegue a su aplicación de nodo. Es posible probar si se utilizó https para realizar la solicitud con req.headers ['x-fordered-proto'] === 'https' .
No es necesario que nos preocupemos por tener certificados SSL locales dentro de la aplicación, etc., como lo haría si estuviera alojando en otros entornos. Sin embargo, primero debe aplicar un complemento SSL a través de los complementos de Heroku si usa su propio certificado, subdominios, etc.
Luego, simplemente agregue lo siguiente para hacer la redirección de cualquier cosa que no sea HTTPS a HTTPS. Esto está muy cerca de la respuesta aceptada anterior, pero:
Código:
Nota para los usuarios de SailsJS (0.10.x). Simplemente puede crear una política (enforceSsl.js) dentro de api / policies:
Luego, haga referencia a config / policies.js junto con cualquier otra política, por ejemplo:
fuente
res.redirect
esto tiene como valor predeterminado una redirección 302 (al menos en Express 4.x). Por motivos de SEO y almacenamiento en caché, probablemente desee una redirección 301 en su lugar. Reemplace la línea correspondiente conreturn res.redirect(301, ['https://', req.get('Host'), req.url].join(''));
Express 4.x
, elimine laapp.configure
línea y solo use la poción interna.app.configure
es un código heredado y ya no se incluye en Express.La respuesta es usar el encabezado de 'x-fordered-proto' que Heroku transmite como lo hace con su proxy thingamabob. (nota al margen: también pasan varias otras variables x que pueden ser útiles, compruébalo )
Mi código:
Gracias Brandon, estaba esperando ese retraso de 6 horas que no me dejaba responder mi propia pregunta.
fuente
GET
través?&& process.env.NODE_ENV === "production"
a su condicional si solo desea que funcione en su entorno de producción.La respuesta aceptada tiene un dominio codificado, lo cual no es demasiado bueno si tiene el mismo código en varios dominios (por ejemplo: dev-yourapp.com, test-yourapp.com, yourapp.com).
Use esto en su lugar:
https://blog.mako.ai/2016/03/30/redirect-http-to-https-on-heroku-and-node-generally/
fuente
req.hostname
con lareq.headers.host
versión quizás expresa estoy en 4.2Escribí un pequeño módulo de nodo que aplica SSL en proyectos express. Funciona tanto en situaciones estándar como en caso de proxies inversos (Heroku, nodejitsu, etc.)
https://github.com/florianheinemann/express-sslify
fuente
Si desea probar el
x-forwarded-proto
encabezado en su localhost, puede usar nginx para configurar un archivo vhost que envía todas las solicitudes a su aplicación de nodo. Su archivo de configuración de nginx vhost podría verse asíNginX
Lo importante aquí es que está enviando todas las solicitudes al puerto localhost 3000 (aquí es donde se ejecuta su aplicación de nodo) y está configurando un montón de encabezados que incluyen
X-Forwarded-Proto
Luego, en su aplicación, detecte ese encabezado como de costumbre
Rápido
Koa
Hospedadores
Finalmente tienes que agregar esta línea a tu
hosts
archivofuente
Debería echar un vistazo a heroku-ssl-redirect . ¡Funciona a las mil maravillas!
fuente
Si está utilizando cloudflare.com como CDN en combinación con heroku, puede habilitar la redirección automática de SSL dentro de cloudflare fácilmente de esta manera:
Inicie sesión y vaya a su panel
Seleccionar reglas de página
fuente
Los usuarios de loopback pueden usar una versión ligeramente adaptada de la respuesta de arcseldon como middleware:
servidor / middleware / forcessl.js
server / server.js
fuente
Esta es una forma más específica de Express para hacer esto.
fuente
fuente
Con app.use y url dinámica. Funciona tanto localmente como en Heroku para mí
fuente
Verificar el protocolo en el encabezado X-Fordered-Proto funciona bien en Heroku, tal como lo ha señalado Derek. Por lo que vale, aquí hay una idea general del middleware Express que utilizo y su prueba correspondiente.
fuente