ExpressJS/Node: 404 images

I've set up a basic node/express server which serves public static javascript and css files fine, but returns a 404 error when attempting to serve images.

The strangest part is that everything works fine when run locally. When run on my remote server (linode), the image problem arrises.

It's really got me scratching my head... What might be the problem?

Here's the server:

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')

var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.compiler({ src: __dirname + '/public', enable: ['less'] }));
  app.use(express.static(__dirname + '/public'));
  app.use(app.router);
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

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

// Globals

app.set('view options', {
  sitename: 'Site Name', 
  myname: 'My Name'
});

// Routes

app.get('/', routes.index);
app.get('/*', routes.fourohfour);

app.listen(3000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

if it works fine locally, maybe it's a case sensitivity issue, do your files have capitals etc?

Alrighty, I got around the issue by renaming my images folder from "/public/images" to /public/image. I don't know why the naming would cause an issue, but I'm glad that's all that was needed.

I had this exact issue. All user generated images uploaded to /static/uploads were not being rendered by express. The strange thing is everything in static/images, static/js, static/css were rending fine. I ensured it wasn't a permissions issue but was still getting a 404. Finally I configured NGINX to render all of my static file (which is probably faster anyway) and it worked!

I'd still love to know why Express wasn't rending my images though.

Here's my NGINX conf if anyone is having this issue:

server {

    # listen for connections on all hostname/IP and at TCP port 80
    listen *:80;

    # name-based virtual hosting
    server_name staging.mysite.com;

    # error and access outout
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location / {
            # redefine and add some request header lines which will be transferred to the proxied server
            proxy_set_header                X-Real-IP $remote_addr;
            proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header                 Host $http_host;
            proxy_set_header                X-NginX-Proxy true;

            #set the location of the web root
            root /var/www/mysite.com;

            # set the address of the node proxied server. port should be the port you set in express
            proxy_pass                      http://127.0.0.1:9001;

            # forbid all proxy_redirect directives at this level
            proxy_redirect                  off;
    }

    # do a case insensitive regular expression match for any files ending in the list of extentions
    location ~* ^.+\.(html|htm|png|jpeg|jpg|gif|pdf|ico|css|js|txt|rtf|flv|swf)$ {

            # location of the web root for all static files
            root /var/www/mysite.com/static;

            # clear all access_log directives for the current level
            #access_log off;

            # set the Expires header to 31 December 2037 23:59:59 GMT, and the Cache-Control max-age to 10 years
            #expires max;
    }
}