我们正在 Build 一个在线相册 . 人们需要登录才能看到图像 . 我们也试图保护图像文件,但我们遇到了问题
通过会话变量,我们检查用户是否已登录 .
$_SESSION['is_ingelogd']
我们构建一个安全页面(检查用户是否已登录) . 我们将此页面包含在每个必须保护的页面中 . 但现在我们也希望保护图像 .
因此,我们构建一个.htaccess文件,将我们照片文件夹中文件的所有请求引用到php页面 . php页面必须检查用户是否已插入 . 如果用户未插入,它将回显带有登录请求的文本 . 如果用户已登录,则php文件必须发送所请求的文件(图像) .
我们使用以下代码执行此操作:
.htaccess文件(在文件夹/ fotoalbum / uploads /中):
RewriteEngine On
RewriteBase /fotoalbum/
RewriteCond %{SCRIPT_FILENAME} !image\.php
RewriteCond %{REQUEST_URI} !image\.php
RewriteRule ^(.*)$ image.php [QSA,L]
.php文件(在文件夹/ fotoalbum /中):
<?php
session_start();
if ($_SESSION['is_ingelogd'] == "1") {
$type = mime_content_type((string)$_SESSION['REQUEST_URI']);
header("Content-type: ".$type);
echo file_get_contents($_SESSION['REQUEST_URI']);
exit;
} else{
echo 'Please <a href="../login.php">login</a> to see this
file.';
}
?>
这段代码工作了一半;如果用户没有进入并尝试打开文件夹/ fotoalbum / uploads /的任何文件,则php会显示登录请求 .
但是如果用户已登录,我们就不会这样做
显示,因为它包含错误 . 一个jpg返回它的url和一个txt文件返回
我们借助以下链接构建此脚本:
-
http://michael.theirwinfamily.net/articles/csshtml/protecting-images-using-php-and-htaccess
-
http://forums.digitalpoint.com/showthread.php?t=1492222(#post 12)
谢谢你的帮助
更新:
我做了一些原型设计, mime_content_type((string)$_SESSION['REQUEST_URI']);
的返回似乎是空白/ null .
我把以下代码放在php文件中:
<?php
$serveruri = parse_url($_SERVER['REQUEST_URI']);
$fileuri = (string)('./uploads/'.basename($serveruri['path']).PHP_EOL);
$file = strval($fileuri);
echo 'URL Is: '.$file;
echo '
type Is: '.mime_content_type((string)$file);
exit;
?>
浏览器显示:
URL Is: ./uploads/test.jpg
Type Is:
您可以看到它不回显内容类型 . 但是当我设定的时候
$file = './uploads/test.jpg';
它完美地回归:
URL Is: ./uploads/test.jpg
Type Is: image/jpeg
有什么建议吗?
4 回答
通过这个主题的许多提示,我使它成功 . 但是它现在可以在URL中使用查询字符串 .
文件夹fotoalbum / uploads /中的.htaccess文件:
文件夹/ fotoalbum /中的getfile.php文件:
要获取图像(或任何类型的文件),网址为
getfile.php?f=file.extension
(其中file.extension是文件夹fotoalbum / uploads /中的文件) .非常感谢大家的帮助!
嗨,我在这里拍摄,但你检查过以确保mime_content_type为你的文件返回正确的mime类型?这似乎是声明
如果输出不正确,则图像或文本文件也无法正确输出 . PHP.net表示不推荐使用mime_content_type函数,因此您可能希望尝试使用finfo_file函数 .
祝好运!
我想PHP文件是用BOM保存的,保存没有BOM .
为什么我猜这个:看起来像一个BOM
将图像和其他二进制文件流式传输回客户端时,应使用readfile()而不是echo file_get_contents() .
Update:
你使用mime_content_type()的问题是由PHP_EOL引起的,它增加了一个换行符 . 还有很多不必要的类型铸造 . 以下是适用于您的清理版本: