Here’s the scenario: you have a WordPress site with a collection of files that need to be protected to only authenticated users. The site is not super high security, but you want a basic obstacle.
All of your searches will talk about .htaccess file assuming you are running Apache. But, you have chosen a leaner server running Lighttpd which does not support .htaccess files.
I installed the Media File Manager plugin to easily create child folders in the uploads folder and be able to move files around. My goal is for non-techies to maintain this site. Using this plugin, I created the members-only folder inside uploads. Inside this folder is this php file:
<?php
if( !empty( $_GET['name'] ) )
{
// check if user is logged
if( is_logged_in() )
{
$clean_name = str_replace("..", "", $_GET['name']);
$clean_name = str_replace("/", "", $clean_name);
$filename = "{$_SERVER['DOCUMENT_ROOT']}/wp-content/uploads/members-only/{$clean_name}";
if( file_exists( $filename ) )
{
header( 'Cache-Control: public' );
header( "Content-Disposition: attachment; filename={$clean_name}" );
if(!empty($_GET['type']))
header( "Content-Type: {$_GET['type']}");
readfile( $filename );
exit;
}
}
}
die( "ERROR: invalid file or you don't have permissions to download it." );
function is_logged_in() {
foreach ($_COOKIE as $cookie_name => $cookie_value) {
if(startswith($cookie_name, "wordpress_logged_in_"))
return true;
}
}
function startswith($haystack, $needle) {
return substr($haystack, 0, strlen($needle)) === $needle;
}
?>
To block a url direct to the file, I added a new rewrite rule to the top of the list:
url.rewrite-final = ( "^/wp-content/uploads/members-only/(.*)" => "/wp-content/uploads/members-only/download.php?name=$1", # Exclude some directories from rewriting "^/(wp-admin|wp-includes|wp-content|gallery2)/(.*)" => "$0", # Exclude .php files at root from rewriting "^/(.*.php)" => "$0", # Handle permalinks and feeds "^/(.*)$" => "/index.php/$1"
At this point, I can put links in my posts and have a modicum of security from users passing around the links to unauthorized users. I can even specify the content-type:
http://www.mysite.com/wp-content/uploads/members-only/newsletter.pdf&type=application/pdf
Hope this helps.