query parse nodejs node node.js express

node.js - query - url parse nodejs



Node.js www-redirección no www (5)

¿Existe la posibilidad de redirigir de alguna manera www a URL que no sean www en node.js? Como no hay htaccess en el servidor web del nodo, tengo curiosidad por saber cómo hacerlo.


A pesar de que esta pregunta tiene casi 3 años, hay algunos problemas sutiles con las respuestas publicadas anteriormente (y sus comentarios), así como algunos buenos consejos en los comentarios que no hicieron que volvieran a las respuestas. Aquí hay algunas cosas importantes a tener en cuenta:

  1. No codifique el http:// o https:// en el URI de redireccionamiento; esto hace que la vida sea mala cuando se cambia entre entornos dev y prod - use req.protocol en req.protocol lugar.
  2. También tenga en cuenta que para utilizar req.protocol manera confiable detrás de un proxy que realiza la terminación SSL (como Elastic Load Balancer), debe asegurarse de que la configuración del trust proxy esté habilitada. Esto asegurará que req.protocol devuelva el protocolo que ve el navegador, no el protocolo que finalmente llegó a su servidor de aplicaciones.
  3. La respuesta aceptada tiene un error lógico, ya que coincide en /^www/ , pero formatea el URI de redirección con /^www./ . En la práctica, probablemente no morderá a nadie, pero resultaría en infinitos bucles de redirección para algo como wwwgotcha.example.com .
  4. Asegúrese de utilizar req.headers.host lugar de req.host , ya que este último elimina el número de puerto. Por lo tanto, si tuviera que gestionar una solicitud de www.example.com:3000 , redirigiría al usuario a www.example.com , menos el número de puerto correcto.
  5. Como señaló Dário , normalmente querrá usar un redireccionamiento 301 al pasar de www a no www (o viceversa) con fines de SEO.
  6. El último problema es el más leve, pero generalmente es más seguro usar req.originalUrl al crear URI de redireccionamiento, por si acaso se está ejecutando en una "subaplicación" montada.

Dicho todo esto, este es mi enfoque recomendado que tiene en cuenta lo anterior:

function wwwRedirect(req, res, next) { if (req.headers.host.slice(0, 4) === ''www.'') { var newHost = req.headers.host.slice(4); return res.redirect(301, req.protocol + ''://'' + newHost + req.originalUrl); } next(); }; app.set(''trust proxy'', true); app.use(wwwRedirect);


En el mundo de DevOps y la creciente adopción de plataformas alojadas, este tipo de cosas nunca deberían ser manejadas por código. Debería manejar el redireccionamiento utilizando infraestructura en su lugar. Poner este código en la aplicación significa que el equipo de Operaciones no puede mitigar los problemas si algo falla en la entrada del ápice. Además, si bien es elegante y brillante y moderno, usar el vértice como URL de tu sitio limita la capacidad de las operaciones para redirigir el sitio si algo sale mal y causa problemas cuando quieres hacer una prueba A / B azul / verde o geo-redirección (en algunos casos). Su código y aplicación deben ser url-agnósticos.


Estás usando Express, ¿verdad? Si es así, puede crear un controlador de ruta que atraviesen todas las solicitudes GET, comprueba si se trata de una URL ''www'' y redirige a la URL adecuada que no sea www, si corresponde.

app.get(''/*'', function(req, res, next) { if (req.headers.host.match(/^www/) !== null ) { res.redirect(''http://'' + req.headers.host.replace(/^www/./, '''') + req.url); } else { next(); } })


Este es un ejemplo básico de cómo se puede imitar el comportamiento de la directiva de redirección de apache en nodejs.

La función de redirección toma un RegExp o una cadena.

var http, redirect; http = require("http"); redirect = function(host, res, pattern, redirect){ if (host == pattern || (pattern instanceof RegExp && host.match(pattern))) { console.log("Redirected " + host); res.writeHead(302, { ''location'': redirect }); res.end(); }}; http.createServer(function(req, res){ redirect(req.headers.host, res, /^www/, ''http://plouf.url''); redirect(req.headers.host, res, ''www.plouf.url'', ''http://plouf.url''); res.writeHead(200, { ''Content-Type'': ''text/plain'' }); res.end(''Hello World/n''); }).listen(8000, ''127.0.0.1'');


Estoy de acuerdo con Sebastian arriba con un pequeño ajuste y si está utilizando Express. Simplemente lo convertiría en un middleware, se procesará en todas las solicitudes.

function removeWWW(req, res, next){ if (req.headers.host.match(/^www/) !== null ) { res.redirect(''http://'' + req.headers.host.replace(/^www/./, '''') + req.url); } else { next(); } } app.use(removeWWW);