I don't have much experience with taint checking, so I'm not sure, but that doesn't look quite right to me. If the $base doesn't pass the conditional, you are still using it in the 'print get("$base/index.html");' even though it's tainted. What if you move the get up inside the conditional? What if you do else 'die'? Does this still give the error:
if ($base =~ m{^(http://[\w\.\/\-]+)$}) {
$base = $1;
print get("$base/index.html");
} else {
die "$base didn't match\n";
}