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)
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?
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.
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.
vous pouvez vérifier l'URL avec une condition if et utiliser app.redirect pour rediriger vers une certaine URL.