只允许从所属网站访问目录中的文件

Hel*_*rns 2 apache .htaccess server

我知道那里有很多类似的问题,我已经对它们进行了全部搜索,但我似乎无法找到任何可行的解决方案。

我的网站根目录中有一个文件夹,其中包含上传的文件,当用户登录时可以从网站查看和下载这些文件。它们位于: https: //example.com/uploads(例如)。我需要该网站继续能够访问它们以显示它们(有些是图像)并提供下载链接(pdf 等),以便用户可以下载它们,但我想避免任何人掌握可以直接下载特定文件,如下所示: https: //example.com/uploads/2020/02/myfile.pdf。或者这些网址进入搜索引擎(或者如果进入,服务器会阻止它们被直接访问)。

我尝试在上传目录中添加一个 .htaccess 文件,其中包含以下内容:

Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

我已经尝试过

Order Allow,Deny
Deny from all
Allow from 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

...据我了解,这可能允许来自站点本身以及本地 URL 的 HTTPS 调用。

但它禁止该站点和直接的 url 请求,这不好。

有没有办法做到这一点?

MrW*_*ite 7

\n

提供对文件的 \xe2\x80\x98official\xe2\x80\x99 访问权限的用户界面具有用户身份验证,是的,但是这些文件仍然存在于目录中,而不会\xe2\x80\x99 阻止任何人访问它们,如果他们知道网址。

\n
\n\n

您需要使用与保护对用户界面的访问相同的身份验证系统来保护文件。您可以通过 IP 地址(客户端IP 地址)保护这些资源的唯一方法- 正如您当前正在尝试的那样.htaccess)是,如果客户端的 IP 是固定的并且提前已知(但如果是这种情况,那么您就不会\首先不需要另一种形式的身份验证)。

\n\n

因此,这主要是对用于验证“用户界面”的任何脚本语言/CMS 的练习。

\n\n

您可以用来.htaccess将对这些文件的请求重写到处理身份验证的服务器端脚本,然后在经过身份验证后将文件提供给客户端。

\n\n

例如:

\n\n
RewriteEngine On\n\nRewriteCond %{REQUEST_FILENAME} -f\nRewriteRule ^uploads/. /serve-protected-file.php [L]\n
Run Code Online (Sandbox Code Playgroud)\n\n

任何映射到有效文件的/uploads/<something>(例如)请求都会路由到您的脚本: 。/uploads/2020/02/myfile.pdf/serve-protected-file.php

\n\n

/serve-protected-file.php然后需要执行如下操作:

\n\n
// 1. Parse the file being requested from REQUEST_URI\n\n// 2. Is the requested file "protected"?\n//    (Serving both protected and public files from the same directory?)\n\n// 3. If not protected then serve/stream the resource to the client. END\n\n// 4. If protected then authenticate the user...\n\n// 5. If user authenticated then serve/stream the resource to the client. END\n\n// 6. Resource is protected and user not authenticated...\n//    Serve a 403 Forbidden. END\n
Run Code Online (Sandbox Code Playgroud)\n\n

(理想情况下,这些“受保护”资源的位置将完全位于文档根目录之外 - 因此默认情况下它们是“私有的” - 并且用户用来访问这些资源的 URL 完全是虚拟的 - 那么你可能不会需要任何额外的编码.htaccess,一切都将由您的前端控制器实现 - 但这一切都取决于您的站点的实现方式以及 URL 的路由方式。)

\n

  • 它是完美的。如此出色的解释,涵盖了 .htaccess 部分和处理文件部分。整个解决方案。太感谢了! (2认同)