Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

URL Rewriting with ExpressJS

I would like to rewrite my URLs on my ExpressJS website. I've used this plugin, https://github.com/joehewitt/express-rewrite, but it doesn't work...

However, I might have made a mistake...

My app.js file :

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'))         })     } }); 

My error message :

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) 
like image 434
tonymx227 Avatar asked May 16 '13 05:05

tonymx227


People also ask

Is Expressjs deprecated?

It has been deprecated since v4. 11.0, and Express 5 no longer supports it at all.

What is the difference between URL rewriting and redirecting?

Simply put, a redirect is a client-side request to have the web browser go to another URL. This means that the URL that you see in the browser will update to the new URL. A rewrite is a server-side rewrite of the URL before it's fully processed by IIS.

What is URL rewriting in C#?

The URL Rewrite module is a native code module that plugs into the request-processing pipeline at the Pre-begin Request or Begin Request stages, and then evaluates the requested URL path by using a set of rewrite rules.

Is URL rewriting safe?

URL link rewriting is an overly manual security control prone to human error.


2 Answers

You could rewrite the URL before you get to the handler you want to use.

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

I've used a similar method to do URL rewrites with regular expressions.

like image 154
Bryan Avatar answered Oct 11 '22 14:10

Bryan


So I had sort of the same issue. I wrote an app that uses the history API on browsers and I wanted to rewrite all non-static URLs back to index.html. So for static files I did:

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

But then for the history API generated paths I did:

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

This meant that any request that wasn't a file or directory in / (such as a URL generated by the history API) wouldn't be rewritten or redirected but instead the index.html file will be served and that then does all the JS routing magic.

Hopefully that's close to what you're looking for?

like image 25
Ahmed Nuaman Avatar answered Oct 11 '22 13:10

Ahmed Nuaman