我将尽我所能解释这一点。我正在开发一个会员驱动的网站,会员可以上传文件以出售它们(他们拥有这些文件的权利)。
前提 1:我想确保每个成员的文件夹不能直接访问,只能通过站点本身的链接访问。
此链接仅在购买者的会员区域生成(用于多次下载文件......并且会员资料也不允许链接到这些文件夹)。
因此,每次成员加入时,他们都会获得一个文件,其中会自动创建一个 .htaccess。
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain.com/.*$ [NC]
RewriteRule .* - [F]
前提 2:当用户上传文件时,该过程的最后一步是确保文件确实已上传。
$uploadFullPath = 'http://www.domain.com/userfiles/'.$_SESSION['uniqueKey'].'/'.$_SESSION['userNumber'].'-'.$_SESSION['latestUpload'].'.'.$_SESSION['latestExt'];
if(fopen($uploadFullPath,"r")!==0){
// update member usages
$query = "UPDATE memberUsage SET usageLicenses=usageLicenses+1 WHERE memberNumber=".$_SESSION['userNumber'];
mysql_query($query) or die(reportError('Unable to increment licenses used'));
echo 'Your file has been successfully updated. You can view your listing within <a href="/user-area/">Your Dashboard</a>';
}
else{
echo 'There seems to have been a problem uploading your file. Please <a href="/user-area/">go back</a> and try again from your \'incomplete listings\' page. Upload Path Provided: <a href="' . $uploadFullPath .'">' . $uploadFullPath . '</a>';
}
为清楚起见,reportError() 函数只是一个预加载的函数,它在需要报告错误时随时生成 mysql_error() 和 mysql_errno(),以节省每次输入的时间。
同样在上面我使用了 fopen() 的地方,我还尝试使用 is_file() 和 file_exists() 来测试文件是否存在。
问题 使用上述 htaccess 限制 fopen()、is_file() 和 file_exists() 都无法找到文件,即使单击生成的 $uploadFullPath 时它也可以工作。
但是,如果我删除 htaccess 限制,上述功能可以正常工作,但同样可以直接访问文件,而无需先购买或通过网站。
请问如何让这两个条件同时运行?我不确定它是否只是 htaccess,只是我的文件检测方法或两者的组合。
我提前感谢您的帮助!