-1

之前可能已经讨论过,但我找不到快速而干净的解决方案。

1) 我的文件/data/夹中有一堆文件:.jpg、.gif、.mp4、.pdf 等。

2)我想创建一个/data/.htaccess文件来捕获每个请求并将其重定向到 PHP 处理器,例如:

/data/filename.jpg -> /data/processor.php?file=filename.jpg

3)processor.php将执行以下操作:

3a) 检查您是否有有效的$_SESSION['logged_in'] == TRUE

3b) 发送相应的标头

3c) 发送文件数据

理想情况下,.htaccess 重定向不会更改浏览器的 URL,因此只要您登录,所有当前文件请求都将保持有效。

编辑:

正如建议的那样,更好的方法是将我的文件保存在 Web 根目录之外。因此,我将只保留/html/data/processor.php所有媒体文件(如 .jpg 和 .mp4)并将其移动到/media/Web 根目录之外。

4

2 回答 2

3

如果您不想更改浏览器中的 URL,那么您需要的是 URL 重写而不是重定向。您的 .htaccess 文件应如下所示:

RewriteEngine On
RewriteRule ^data/(.+) /data/processor.php?file=$1 [L]

这将导致请求/data/filename.jpg实际请求/data/processor.php?file=filename.jpg而不对浏览器中的 URL 执行任何操作。然后您的 processor.php 脚本可以从那里接管。

请记住,您必须在服务器配置中启用 mod_rewrite。

还有其他要考虑的。您可能希望也可能不希望将这些文件保留在文档根目录之外,具体取决于哪个更重要:安全性或可用性。如果 ,htaccess 部分由于某种原因失败,您是否希望文件默认可访问?换句话说,在这种情况下,您是否让用户怀疑他们的访问权限?如果是这样,最好将文件留在原处,因为 URL 将正常工作并交付用户期望的文件。如果您想在不授予访问权限方面出错,那么将文件移到文档根目录之外会很好,这样如果没有通过您的脚本的 mod_rewrite 规则就无法访问它们。

/data/processor.php

以下是您的处理器的示例:

<?php
// Get MIME Type
    $finfo     = finfo_open( FILEINFO_MIME_TYPE );
    $mime_type = finfo_file( $finfo, $_GET['file'] );
    finfo_close( $finfo );

// Send headers
    header( "Content-Type: $mime_type" );
    header( "Content-Length: " . filesize( $_GET['file'] );

// Send file data
    readfile( $_GET['file'] );
?>

如果需要,请务必包含路径,$_GET['file']具体取决于您最终定位文件的位置。

于 2013-08-09T16:48:20.370 回答
0

这是为我解决的完整解决方案。以防万一它可能对任何人有用。谢谢@Nick Coons!

HTAccess 文件/html/media/.htaccess

RewriteEngine On

RewriteCond %{REQUEST_URI} \.(png|jpe?g)$ [NC]
RewriteRule ^(.+) index.php?file=$1 [L]

处理器文件/html/media/index.php

<?php

require_once '../config/config.php';

// must be logged in
if ( ! @$_SESSION['logged_in']) exit('Access denied. You are not logged in.');

// check if file exists
$file = dirname(dirname(getcwd())) . '/media/' . @$_GET['file'];
if ( ! is_file($file)) exit('404');

// Get MIME Type
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $file);
finfo_close($finfo);

// Send headers
header("Content-Type: $mime_type");
header('Content-Length: ' . filesize($file));

// Send file data
readfile($file);

/* End of file */

媒体文件夹/media/

.png and .jpg files are stored here outside of the web-root

现在请求/html/media/bike.png仅适用于登录用户。

于 2013-08-12T18:36:14.477 回答