Перенаправление URL с помощью ExpressJS
Я хотел бы переписать свои URL-адреса на моем сайте ExpressJS. Я использовал этот плагин, https://github.com/joehewitt/express-rewrite, но он не работает...
Однако я, возможно, допустил ошибку...
Мой файл 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'))
})
}
});
Мое сообщение об ошибке:
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)
Ответы
Ответ 1
Итак, у меня была такая же проблема. Я написал приложение, которое использует API истории в браузерах, и я хотел переписать все нестатические URL-адреса обратно на index.html
. Поэтому для статических файлов я сделал:
app.configure(function() {
app.use('/', express.static(__dirname + '/'));
});
Но тогда для API, созданных API истории, я сделал:
app.get('*', function(request, response, next) {
response.sendfile(__dirname + '/index.html');
});
Это означало, что любой запрос, который не был файлом или каталогом в /
(например, URL-адресом, сгенерированным API-интерфейсом истории), не был бы перезаписан или перенаправлен, но вместо этого будет использоваться файл index.html
и что затем выполняет всю магию маршрутизации JS.
Надеюсь, это близко к тому, что вы ищете?
Ответ 2
Вы можете переписать URL-адрес, прежде чем перейдете к обработчику, который хотите использовать.
app.use(function(req, res, next) {
if (req.url === '/toto') {
req.url = '/heytoto';
}
next();
});
app.get('/heytoto', ...);
Я использовал похожий метод для перезаписи URL с помощью регулярных выражений.
Ответ 3
Решение, которое работает без response.sendfile(..)
, заключается в использовании промежуточного программного обеспечения перезаписи, которое было вставлено до app.use(express.static(..))
следующим образом:
// 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(...)
Таким образом, expressjs правильно распознает переписывание. Затем промежуточное программное обеспечение static
будет обслуживать файл.
Ответ 4
Вы можете проверить URL с условием if и использовать app.redirect для перенаправления на определенный URL.
Ответ 5
Попробуйте следующее:
app.get('/toto', function(req, res) {
res.redirect('/heytoto');
});