The following sentence is false.
A backported whois client for Ubuntu 8.04 LTS (Hardy) »

Conditional redirection with lighttpd: evolving my webtmp folder

Permalink 01/10/10 14:54, by Ryan, Categories: Geekery, Howto , Tags: , , , ,

Very often, I need to quickly host a file for use in a forum post or on IRC. My usual approach has been to mount a "temporary" directory from my web server on my desktop, over ssh. However, I recently started using Dropbox to keep my important files synced: with this, I can access my school work from school without having to resort to ssh heroics or remembering to carry a flash drive with me (let's not get started on keeping it synchronized). Dropbox offers 2GB of storage for free, and they include a handy Public folder you can use to share files. Nice.

My little temporary directory, in practice, isn't very temporary. I rarely delete anything from it; indeed, the oldest image is nearing two years old. I also keep throughput test files there, and I kinda need those to be on my server. However, I hate remembering multiple long URLs, especially ones like http://www.hoopycat.com/~rtucker/tmp/moooar.PNG and http://dl.dropbox.com/u/3597105/system-fullpower.png. I also want to be able to transparently move files around as my needs change. And, most importantly, I want my stuff under the hoopycat.com domain for maximum flexibility.

So, I set up a dedicated hostname: http://drop.hoopycat.com/.

Here's the flow:

  • A request is received for http://drop.hoopycat.com/filename. (Note: requests for / get redirected to http://hoopycat.com/).
  • If filename exists in ~rtucker/public_html/tmp, serve it up.
  • If it doesn't, issue a HTTP redirect to http://dl.dropbox.com/u/3597105/filename.

Easy enough, and it works darn well. I do no checks for the file's existence on Dropbox, so their 404 page gets served up for totally bogus URLs. This is not a big deal in practice.

The configuration of lighttpd is simple, using mod_magnet and a small Lua script. To lighttpd.conf or a conf-available/ file of your choice, add:

Code:

server.modules += ( "mod_magnet" )
 
$HTTP["host"] == "drop.hoopycat.com" {
    server.document-root = "/home/rtucker/public_html/tmp/"
    url.redirect += ( "^/$" => "http://hoopycat.com/" )
    magnet.attract-physical-path-to = ( "/etc/lighttpd/conditional-redirect.lua" )
}

Then, create /etc/lighttpd/conditional-redirect.lua with the following script, borrowed from an example at http://redmine.lighttpd.net/projects/lighttpd/wiki/AbsoLUAtion:

Code:

local filename = lighty.env["physical.path"]
local stat = lighty.stat( filename )
if not stat then
  local static_name = string.match( filename, "tmp/([^/]+)$" )
  lighty.header["Location"] = "http://dl.dropbox.com/u/3597105/" .. static_name
return 302
end

Remember to replace the dl.dropbox.com URL with yours (and change everything else, too).

Assuming DNS is set up correctly and mod_magnet is installed (it's lighttpd-mod-magnet in Ubuntu 8.04), a restart of lighttpd should yield good results!

Leave a comment »

No feedback yet

Leave a comment


Your email address will not be revealed on this site.

Your URL will be displayed.
PoorExcellent
Code:
(Line breaks become <br />)
(Name, email & website)
(Allow users to contact you through a message form (your email will not be revealed.)

post snap widget by EdB feed reading by SimplePie

Welcome to Ryan Tucker's standard output blog. Here, you'll find variety of geeky projects, random prognostications, and other miscellany. Strive at all times to bend, fold, spindle, and mutilate.

Recent Twitterings

    Stalk me with RSS

    Bogroll

      Search the Blog

       

      Support the Beer Fund

      Life's too short for crappy hosting

      [Powered by Linode]

      Dehumidifier

      powered by b2evolution

      © 1973-2010 by Ryan Tucker (Public Key)

      Contact | b2evo skin by Asevo | PHP framework | vps | François