1

您知道是否可以通过单击代码中的链接来使文件仅可供下载,并通过尝试通过复制/粘贴地址栏中的 URL 来访问文件来限制访问?

例子:

我以 PDF 格式生成发票,并且我想让它们仅可用于已登录的客户,并且仅可用于为该特定客户生成的发票。客户 A 不能查看客户 B 的发票,反之亦然。

现在我将这些发票保存在这里:www.mydomain.com/invoices/

客户 A 的发票类似于:www.mydomain.com/invoice/20130202_120045.pdf

现在我想让客户在我在 HTML 中添加这样的链接时只能看到这个 PDF:

<a href="http://www.mydomain.com/invoice/20130202_120045.pdf">See invoice</a>

但不应通过在地址栏中直接输入 www.mydomain.com/invoice/20130202_120045.pdf 来访问 PDF。

这在某种程度上可能吗?

4

3 回答 3

4

有多种方法,但我想说这是最简单的一种:

  • 将实际的 PDF 存储在只能由 PHP 访问的目录中(.htaccess例如,在您的 Web 根目录之外或被阻止)。
  • 验证 PHP 脚本中的访问权限。
  • 让下载通过 PHP 脚本进行,使用标头Content-disposition设置文件名并使用readfile()输出文件内容。
于 2013-02-05T10:36:39.290 回答
2

当然 - 最简单的方法是使用.htaccess。您可以将所有不应通过 URL 下载的文件存储在一个文件夹中,然后将它们全部重定向到 PHP 脚本。

这样,当一个人尝试下载时http://www.mydomain.com/invoice/20130202_120045.pdf,他们将(在后台,通过 .htaccess)重定向到某个地方的 PHP 脚本。

然后,该 PHP 脚本可以验证此人是否已获得授权(通过会话、cookie...),并且仅在授权时输出原始文件(如果不是,则输出错误消息)。

您可以使用fgets()函数部分输出文件,以确保不会使服务器上的内存过载。

这种方法的一个缺点可能是可扩展性,因为用户下载的文件越多,需要运行的 PHP 脚本就越多,并且在某些时候可能会使 Apache 过载。但如果代码写得好(即使用fgets()等),这不太可能

于 2013-02-05T10:37:22.017 回答
0

使用mod_xsendfile它非常容易。您将文件粘贴到文档根目录之外并发出一个特殊的标头,告诉 Apache 代表您发送文件:

设置好之后,代码就这么简单:

<?php
...
if ($user->isLoggedIn())
{
    header("X-Sendfile: $path_to_somefile");
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$somefile\"");
    exit;
}
?>
<h1>Permission denied</h1>
<p>Login first!</p>

源代码取自模块页面本身。

于 2013-02-05T11:13:15.357 回答