Redirect loop with node express.js
express, node.js
Solution
This happens:
- a request for `/lessons` comes in;
- the static middleware sees the `public/lessons` folder and assumes that's what the intended target is; because it's a folder, it will generate a redirect to `/lessons/` (see below);
- static middleware picks that request up again, but notices there's no `index.html` in that folder, and hands it off to the next middleware (`connect-slashes`);
- the `connect-slashes` middleware removes the trailing slash and issues a redirect to `/lessons`;
- the whole loop starts again;
You can prevent the static middleware from adding a trailing slash, which will fix your redirect loop I think:
app.use(express.static(__dirname + '/public', { redirect : false }));
Problem
I have simple webpage with `/about`, `/contact`, `/home` and `/lessons` routes defined. All routes work okay except for `/lessons`. I instantly get a redirect loop (`Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects`). Here's my main `server.js` code : ``` var port = process.env.PORT || 8888; var app = require('./app').init(port); var markdown = require('./markdown'); var lessons = require('./lessons.json').lessons; // app.use(function(req,res,next) { // console.log('adding lessons to locals'); // res.locals.date = new Date().toLocaleDateString(); // res.locals.lessons = lessons; // next(); // }); // app.use(app.router); app.get('/', function (req, res) { console.log('controller is : home'); res.locals.controller = 'home'; res.render('home'); }); app.get('/:controller', function (req, res, next) { var controller = req.params.controller; console.log('controller is : '+ controller); if (controller == 'about' || controller == 'contact') { res.locals.controller = controller; res.render(controller); } else { console.log('next was taken!'); next(); } }); app.get('/lessons', function(req, res) { res.locals.lessons = lessons; console.log('controller is : lessons'); res.render('lessons'); }); app.get('/lessons/:lesson', function(req, res) { console.log('controller is : lesson'); res.locals.controller = 'lessons'; res.send('gimmie the lesson'); }); /* The 404 Route (ALWAYS Keep this as the last route) */ app.get('/*', function (req, res) { console.log('got 404 request to ' + req.url); res.render('404'); }); ``` and here's the `app.js`file which is used for server initialization: ``` var express = require('express'); var slashes = require('connect-slashes'); exports.init = function (port) { var app = express(); app.use(express.static(__dirname + '/public')); // add middleware to remove trailing slash in urls app.use(slashes(false)); app.set('views', __dirname + '/views') app.set('view engine', 'ejs'); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.logger()); app.enable("jsonp callback"); if ('development' == app.get('env')) { app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); app.use(express.logger({ format: ':method :url' })); } if ('production' == app.get('env')) { app.use(express.errorHandler()); } app.use(function (err, req, res, next) { console.log('Oops, something went wrong'); res.render('500.ejs', { locals: { error: err }, status: 500 }); }); app.listen(port); console.log("Listening on port %d in %s mode", port, app.settings.env); return app; } ``` I have tried debugging the app with `node-inspector` but it's useless since the app doesn't seem to go into any of the `app.get`s to try to match. It immidiately gives me the error when I try to access `localhost:8888/lessons` EDIT: I think I have found the root of the problem : - My `/public` dir has a `lessons` folder - My `/views` dir has a `lessons.ejs` view When I change `/public/lessons` into `/public/lessons11` for example, the problem is resolved. Can someone explain to me what's express flow in the original scenario that causes the redirect loop ? also, what can I do to resolve it ? Thanks