Redirigir todas las barras de seguimiento globalmente en express

Estoy usando Node.js y Express y tengo el siguiente enrutamiento:

app.get('/', function(req,res){ locals.date = new Date().toLocaleDateString(); res.render('home.ejs', locals); }); function lessonsRouter (req, res, next) { var lesson = req.params.lesson; res.render('lessons/' + lesson + '.ejs', locals_lessons); } app.get('/lessons/:lesson*', lessonsRouter); function viewsRouter (req, res, next) { var controllerName = req.params.controllerName; res.render(controllerName + '.ejs', locals_lessons); } app.get('/:controllerName', viewsRouter); 

Tengo un widget Disqus en mis páginas de lecciones y he notado un comportamiento extraño que cuando voy a myapp.com/lessons y myapp.com/lessons/ / obtengo dos páginas diferentes (una de ellas tenía un comentario que agregué previamente en Disqus y el otro no tiene un comentario).

¿Hay alguna forma de “canonizar” todas mis direcciones URL para que no tengan barras diagonales? Intenté agregar el indicador de strict routing para express, pero los resultados fueron los mismos

Gracias

Intenta agregar un middleware para eso;

 app.use((req, res, next) => { const test = /\?[^]*\//.test(req.url); if (req.url.substr(-1) === '/' && req.url.length > 1 && !test) res.redirect(301, req.url.slice(0, -1)); else next(); }); 

La respuesta de Tolga Akyüz es inspiradora, pero no funciona si hay algún personaje después de la barra. Por ejemplo, http://example.com/api/?q=a se redirige a http://example.com/api lugar de a http://example.com/api?q=a .

Aquí hay una versión mejorada del middleware propuesto que soluciona el problema al agregar la consulta original al final de la URL de destino de redireccionamiento:

 app.use(function(req, res, next) { if (req.path.substr(-1) == '/' && req.path.length > 1) { var query = req.url.slice(req.path.length); res.redirect(301, req.path.slice(0, -1) + query); } else { next(); } }); 

Nota: Tal como lo señala jamesk y se establece en RFC 1738 , la barra inclinada final solo se puede omitir cuando no hay nada después del dominio. Por lo tanto, http://example.com?q=a es una URL no válida donde http://example.com/?q=a es válida. En tal caso, no se debe redireccionar. Afortunadamente, la expresión req.path.length > 1 se ocupa de eso. Por ejemplo, dada la URL http://example.com/?q=a , la ruta req.path es igual a / y, por lo tanto, se evita la redirección.

El middleware connect-slashes fue diseñado específicamente para esta necesidad: https://npmjs.org/package/connect-slashes

Instalarlo con:

$ npm install connect-slashes

Lea la documentación completa: https://github.com/avinoamr/connect-slashes

Estoy agregando esta respuesta porque tuve demasiados problemas con otras soluciones.

 router.use(function(req, res, next) { if (req.originalUrl != req.baseUrl + req.url) { res.redirect(301, req.baseUrl + req.url); } else next(); }); 

Esto traducirá:

 /page ==> /page/ /page?query=value ==> /page/?query=value 

Las respuestas anteriores funcionarán en muchos casos, pero GET vars puede encontrar problemas y si tuviera que ponerlo dentro de otro middleware expreso, su dependencia de req.path causará un problema y su dependencia de req.url también puede tener efectos secundarios no deseados. . Si está buscando una solución más estricta, esto hará el truco:

 // Redirect non trailing slash to trailing slash app.use(function(req, res, next){ // Find the query string var qsi = req.originalUrl.indexOf('?'); // Get the path var path = req.originalUrl; if(qsi > -1) path = path.substr(0, qsi); // Continue if the path is good or it's a static resource if(path.substr(-1) === '/' || ~path.indexOf('.')) return next(); // Save just the query string var qs = ''; if(qsi > -1) qs = req.originalUrl.substr(qsi); // Save redirect path var redirect = path + '/' + qs; // Redirect client res.redirect(301, redirect); console.log('301 redirected ' + req.originalUrl + ' to ' + redirect); }); 

Siempre está contento con las variables GET y no se romperá si lo pusiera dentro del middleware.

Un trazador de líneas:

 router.get('\\S+\/$', function (req, res) { return res.redirect(301, req.path.slice(0, -1) + req.url.slice(req.path.length)); }); 

Esto solo capturará las URL que necesitan ser redirigidas e ignorará las demás.

Resultados de ejemplo:

 / ==> / /a ==> /a /a/ ==> /a /a/b ==> /a/b /a/b/ ==> /a/b /a/b/?c=d ==> /a/b?c=d 
Intereting Posts