The Pug Automatic

Tumblr in a subdirectory

Written June 24, 2007. Tagged PHP.

I now have a tumblelog, powered by Tumblr.

Tumblr seems quite awesome – simple and powerful, just the way I like it. They even offer Tumblr on your own (sub)domain if you can configure your DNS A records.

I didn't want to use a subdomain, though. My site is on a subdomain already, and sub-subdomains look silly. I don't like using subdomains directly under nyh.se for personal stuff since it's not namespaced (I considered svnrik.nyh.se before going with svn.nyh.se for my SVN repository…). Anyway, since Tumblr don't offer this, I threw together a tiny proxy.

Over at https://henrik.nyh.se/tumble, this is my .htaccess:

.htaccess
RewriteEngine On
RewriteBase /tumble

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ proxy.php?url=http://malesca.tumblr.com/$1

and this is proxy.php:

<?php

$from = "malesca.tumblr.com";
$unto = "henrik.nyh.se/tumble";

// Because Dreamhost doesn't do remote fopens, and to get content-type
function fetch($url) {
$curl = curl_init();
$timeout = 5; // set to zero for no timeout
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
$html = curl_exec($curl);
$content_type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
curl_close($curl);
return array($html, $content_type);
}

list($html, $content_type) = fetch($_GET['url']);

// Fix root-relative links etc.
$html = preg_replace('/\b(href|src|rel)="\//', '$1="http://'.$unto.'/', $html);
// Replace the old URL with the new
$html = str_replace($from, $unto, $html);

header("Content-type: $content_type");
echo $html;

?>

This piece of code just mirrors the content as well as the content-type of anything on http://malesca.tumblr.com to https://henrik.nyh.se/tumble. Fixes links in the RSS feed as well. Pretty neat.

You obviously need a PHP with libcurl.

You'll likely want to change the $from and $unto values at the top, as well as the URL in the .htaccess rewrite rule.