Image proxy middleware


This is an image proxy for node.js/browser. It is meant to be used as a connect/express middleware, but it can be used by itself.

User images won't always show up on your site:

  • Many image hosts, such as imgur, do not support HTTPS. If your site only uses HTTPS, you're going to get mixed message warnings.
  • Some image hosts block hotlinking. That's fine - we'll proxy the images to our servers and serve it ourselves.

Generally speaking, you should put this proxy instance behind a cache as this module does not cache any images. If you use CloudFlare as a CDN, you can even prevent hotlinking.

Inspiration: camo.

In node.js:

npm install iproxy

For the browser, we use component:

component install discore/iproxy

You should mount the middleware to some prefix. For example, we'll use the prefix /proxy:

app.use('/proxy', require('iproxy'))

Assume we use the prefix /proxy. Images are now proxied at the address '/proxy' + url where url is the URL of the image without the protocol. ex., /proxy/i.imgur.com/mFtyLGJ.gif would proxy the image http://i.imgur.com/mFtyLGJ.gif through your server.

We want to create an iproxy instance with the prefix /proxy:

var iproxy = require('iproxy')('/proxy')
  • `iproxy(url, callback)``.
    • url - the image URL you want to proxy.
    • callback(err, url)
      • err - non-null, the image failed to load and proxy.
      • url - the image URL that worked - either the original URL or the proxied URL.
iproxy('http://i.imgur.com/mFtyLGJ.gif', function (errurl) {
  // Input URL will match the output URL 
  // because the image works 
  url === http://i.imgur.com/mFtyLGJ.gif 
iproxy('https://i.imgur.com/mFtyLGJ.gif', function (errurl) {
  // The output URL will be a proxied URL 
  // since imgur doesn't support HTTPS 
  url === /proxy/i.imgur.com/mFtyLGJ.gif

Note: it's up to you what protocol you'd like to test. You may want to use //i.imgur.com/mFtyLGJ.gif protocol-less URLs.