我猜您可能遇到的一个问题是,如果您尝试<img src="protected.jpg" />
从不受保护的 php 文件中输出,您将能够显示 HTML,但不能显示图像文件本身。
如果我正确理解你想要做什么,你需要:
编辑:代理示例:我似乎无法在线找到示例,所以这是我希望控制从 PHP 对文件的访问时经常使用的功能(例如,这可能是需要从 $ 验证其访问权限的敏感数据_SESSION 或 DB 值):
function send_binary_data($path, $mimetype, $filename = null){
@ob_clean();
if($filename === null) $filename = basename($path);
$size = filesize($path);
//no-cache
header('Cache-Control: no-cache, must-revalidate, public');
header('Pragma: no-cache');
//binary file
header('Content-Transfer-Encoding: binary');
//mimetype
header('Content-Type: ' . $mimetype);
header('Content-Length: ' . $size);
header('Content-Disposition: inline; filename=' . $filename);
header('Content-Description: ' . $filename);
$chunksize = 1 * (1024 * 1024);
$buffer = '';
$handle = fopen($path, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, $chunksize);
print $buffer;
}
$result = fclose($handle);
unset($handle);
$handle = null;
die();
}
当然,您仍然需要限制来自 .htaccess 的直接访问,但如果是代理,您会将所有请求重定向到不受保护的代理脚本,如下所示:
RewriteEngine ON
RewriteRule ^(.*)$ /proxy.php?file=$1 [NC,QSA]
proxy.php 将包含以下内容:
if(!isset($_GET['file'])) die('file not set');
$file = $_GET['file'];
//perform all your custom checking, including security checks due to retrieving data from $_GET, and if access is granted :
$path = 'yourpath/'.$file;
$mimetype = 'defineregardingyour/ownrules';
send_binary_data($path, $mimetype);