我可以防止未经授权的用户访问文件而不将文件存储在文档根目录之外吗?

Can I prevent unauthorized users from accessing files without storing files outside the document root?

我遇到了一个有趣的难题...我在 WAMP 服务器上托管了几个 .mp4 文件。我很清楚将文件存储在文档根目录之外并使用 PHP 脚本在检索文件内容之前对用户进行身份验证的方法。但是,这些 .mp4 文件需要位于文档根目录中。有什么方法可以验证试图直接访问这些文件之一的用户吗?我尝试了 .htaccess 重写,它接受以“.mp4”结尾的请求 URL 并重定向到 PHP 脚本,将请求的文件作为参数传递,但当然这只是循环。

这是 .htaccess 文件中的重写规则...

RewriteEngine on
RewriteRule ^(.*).mp4$ /media/auth.php?file=.mp4

当时的想法是,用户将尝试访问 http://www.example.com/media/myVideo.mp4,此请求将被路由到 PHP 脚本 (auth.php),该脚本将从URL 使用 $_GET['file'],它将使用 $_SESSION 变量对用户进行身份验证,然后使用 header('Location: ' . $file) 将经过身份验证的用户发送到实际文件。同样,我在实施后很快意识到它只会循环...

如有任何帮助,我们将不胜感激。谢谢!

这就是为什么它们不能在文档根目录之外...

@IdontDownVote,非常复杂,但我会尝试一个简短的版本......我的这个主要适用于文档根目录之外的文件,但有一个严重的问题。当我使用 PHP 脚本访问文件时,我能够在 Chrome 浏览器中查看视频,播放、暂停、倒带,整个过程。唯一的(大)问题是当我使用这种方法时,我无法投射视频。当我直接访问 .mp4 文件时,它为我提供了下载或投射选项,但使用 PHP 脚本时,只有下载选项可用。相信我,我已经尝试了所有方法,包括与两位 Google 开发人员进行讨论。我在 Stack Overflow 上发布了关于这个问题的帖子,但并不高兴...

Why can't I cast an MP4 file served by PHP from outside of the document root?

我不确定为什么这会被否决,这让我很头疼,我只是在寻求建议...

首先,您是否在通过 PHP 在文档根目录之外提供文件时对其进行了测试?

When I access a .mp4 file directly, it gives me the option to Download or Cast, but using the PHP script

如果可以,那么您可以简单地阻止对除一个 PHP 文件之外的所有文件的访问,然后使用它来分发(您也可以允许访问 *.php..

#.htaccess
Order Deny,Allow
Deny from all

<Files index.php>
Allow from all
</Files>

这将只允许在 htacccese 所在的任何文件夹(和子文件夹)中访问 index.php。如果您在 PHP 中有一个现有的登录系统,这可能会更好您想为您的用户使用。

如果你不能,那么我唯一能做的就是尝试使用 BasicAuth 和 Htaccess,就像这样:

#.htaccess
Order Deny,Allow
Deny from all

AuthType Basic
AuthName "Admin Only"
AuthUserFile /pathto/.htpasswrd
require valid-user

Allow from all

然后在名为 .htpasswrd 的文件中放入如下内容:

admin:$apr1$o48wfurrWaWCjD85kBu/ydGKsQeq/

您可以使用类似这样的方法来散列密码。

http://www.htaccesstools.com/htpasswd-generator/

然后当您给 Chrome url 时,您必须包含 user:pass@ 部分以绕过登录。

http://user:pass@somedomain/path/to/video.mp4

如果您不想将其绑定到现有登录名,则必须创建一些系统来将 htpasswrd 文件中的密码与您的用户的密码同步。这真的不应该太难。我做了一个将我们的站点用户帐户同步到 sFTP 服务器,这真的很痛苦,因为安全,我们有 3 个 sFTP 服务器(旧版、普通版和开发版)。无论如何,您基本上只需要保留他们的 user/password 列表,然后在用户 created/deleted 或更改密码时更新文件。

也许它会起作用(老实说我不知道​​......大声笑)。

值得一试。