首页 文章

通过.htaccess RewriteRule保护文件夹到php

提问于
浏览 713
2

我们正在 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文件返回

我们借助以下链接构建此脚本:

谢谢你的帮助


更新:

我做了一些原型设计, 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 回答

  • 1

    我想PHP文件是用BOM保存的,保存没有BOM .

    为什么我猜这个:看起来像一个BOM

  • 0

    通过这个主题的许多提示,我使它成功 . 但是它现在可以在URL中使用查询字符串 .

    文件夹fotoalbum / uploads /中的.htaccess文件:

    Options -Indexes
    <Files *>
      deny from all
    </Files>
    

    文件夹/ fotoalbum /中的getfile.php文件:

    <?php
    
    //this file checks if user is logged in and dies the request if the user is not logged in
    include_once('./config.php');
    
    $file = "uploads/" . $_GET['f'];
    $type = mime_content_type($file);
    
    header("Content-type:" .$type);
    echo file_get_contents($file);
    
    ?>
    

    要获取图像(或任何类型的文件),网址为 getfile.php?f=file.extension (其中file.extension是文件夹fotoalbum / uploads /中的文件) .

    非常感谢大家的帮助!

  • 0

    嗨,我在这里拍摄,但你检查过以确保mime_content_type为你的文件返回正确的mime类型?这似乎是声明

    header("Content-type: ".$type);
    

    如果输出不正确,则图像或文本文件也无法正确输出 . PHP.net表示不推荐使用mime_content_type函数,因此您可能希望尝试使用finfo_file函数 .

    祝好运!

  • 0

    将图像和其他二进制文件流式传输回客户端时,应使用readfile()而不是echo file_get_contents() .

    Update:

    你使用mime_content_type()的问题是由PHP_EOL引起的,它增加了一个换行符 . 还有很多不必要的类型铸造 . 以下是适用于您的清理版本:

    <?php
    $serveruri = parse_url($_SERVER['REQUEST_URI']);
    $file = basename($serveruri['path']);
    
    
    echo 'URL Is: ' . $file;  
    echo '
    type Is: ' . mime_content_type($file); exit(); ?>

相关问题