2

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);
Greta Gail
  • 23
  • 1
  • 3

4 Answers4

2

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

TJ Holowaychuk
  • 261
  • 1
  • 2
  • Alrighty, I got around the issue by renaming my images folder from "/public/images" to "/public/image". I still don't know why the naming would cause an issue, but I'm glad that's all that was needed. I'll be answering this question and closing it when the time limit is reached. – Greta Gail May 02 '12 at 16:27
  • I think it has to do with my Linode machine. The 404 is coming from nginx and not node. Thanks for the reply TJ; I've got some more research to do. – Greta Gail May 02 '12 at 16:42
1

I had this issue, but it ended up being that I had caps in the trailing .JPG extension and was calling .jpg in html. Windows is not case sensitive on file types, CentOS is...

Sawyer612
  • 11
  • 2
0

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.

Greta Gail
  • 23
  • 1
  • 3
0

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;
    }
}
jwerre
  • 9,179
  • 9
  • 60
  • 69