web-dev-qa-db-fra.com

Réécriture d'URL avec ExpressJS

Je souhaite réécrire mes URL sur mon site Web ExpressJS. J'ai utilisé ce plugin, https://github.com/joehewitt/express-rewrite , mais ça ne marche pas ...

Cependant, j'ai peut-être commis une erreur ...

Mon fichier app.js:

var express = require('express')
    , index = require('./routes/index.js')
    , admin = require('./routes/admin.js')
    , contact = require('./routes/contact.js')
    , posts = require('./routes/posts.js')
    , http = require('http')
    , path = require('path')
    , hash = require('./auth').hash
    , db = require('./models')
    , favicons = require('connect-favicons')
    , rewriter = require('express-rewrite');


var app = express();

app.configure(function () {
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.favicon(__dirname + '/public/images/FAVICON.ico'));
    app.use(favicons(__dirname + '/public/images/Apple-touch-icon.png'));
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.static(path.join(__dirname, 'public')));
    app.use(express.cookieParser());
    app.use(express.cookieSession({
            secret: 'SECRET',
            cookie: { access: false }
        })
    );
    app.use(rewriter);
    app.use(app.router);
    app.use(function(req, res, next){
        res.render('404.jade', {
            title: "404 - Page Not Found",
            showFullNav: false,
            status: 404,
            url: req.url
        });
    });
});

app.configure('development', function () {
    app.use(express.errorHandler());
});

app.get('/', index.index);

app.get('/toto', rewriter.rewrite('/heytoto'));

db.sequelize.sync().complete(function(err) {
    if (err) {
        throw err
    } else {
        http.createServer(app).listen(app.get('port'), function(){
            console.log('Express server listening on port ' + app.get('port'))
        })
    }
});

Mon message d'erreur:

Express
500 TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'match'
at Object.rewriter [as handle] (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express-rewrite/rewrite.js:3:26)
at next (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/proto.js:199:15)
at Object.cookieSession [as handle] (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js:113:5)
at next (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/proto.js:199:15)
at Object.cookieParser [as handle] (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js:60:5)
at next (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/proto.js:199:15)
at resume (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/middleware/static.js:60:7)
at SendStream.error (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/middleware/static.js:73:37)
at SendStream.EventEmitter.emit (events.js:126:20)
at SendStream.error (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/send/lib/send.js:147:51)
21
tonymx227

Donc, j'avais en quelque sorte le même problème. J'ai écrit une application qui utilise l'API d'historique sur les navigateurs et je voulais réécrire toutes les URL non statiques en index.html. Donc pour les fichiers statiques j'ai fait:

app.configure(function() {
  app.use('/', express.static(__dirname + '/'));
});

Mais alors pour les chemins générés par l’API d’historique, j’ai fait:

app.get('*', function(request, response, next) {
  response.sendfile(__dirname + '/index.html');
});

Cela signifiait que toute demande qui n'était pas un fichier ou un répertoire dans / (telle qu'une URL générée par l'historique API) ne serait ni réécrite ni redirigée, mais le fichier index.html serait servi et servirait alors de la magie du routage JS. .

J'espère que c'est proche de ce que vous cherchez?

34
Ahmed Nuaman

Vous pouvez réécrire l'URL avant de vous rendre au gestionnaire que vous souhaitez utiliser.

app.use(function(req, res, next) {
   if (req.url === '/toto') {
     req.url = '/heytoto';
   }
   next();
});

app.get('/heytoto', ...);

J'ai utilisé une méthode similar pour effectuer des réécritures d'URL avec des expressions régulières.

25
Bryan

Une solution qui fonctionne sans response.sendfile(..) consiste à utiliser un middleware de réécriture qui est inséré avant app.use(express.static(..)) comme ceci:

// forward all requests to /s/* to /index.html

app.use(function(req, res, next) {

  if (/\/s\/[^\/]+/.test(req.url)) {
    req.url = '/index.html';
  }

  next();
});

// insert express.static(...)

De cette façon, expressjs reconnaît correctement la réécriture. Le middleware static se chargera alors de servir le fichier.

3
nre

vous pouvez vérifier l'URL avec une condition if et utiliser app.redirect pour rediriger vers une certaine URL.

0
Rubin bhandari