Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将标头:位置发送到web外根文件_Php_Apache - Fatal编程技术网

Php 如何将标头:位置发送到web外根文件

Php 如何将标头:位置发送到web外根文件,php,apache,Php,Apache,我正在制作一个web应用程序,它只允许注册成员从文件夹目录下载zip文件夹 我真的需要知道哪种方法是保护文件夹的正确方法,因为只有存储在我数据库中的成员才能访问它们,所以问题是,如果有人找到了目录和文件名,就没有什么可以阻止他们访问它 我做了一些研究,发现了一些方法,但它们都有很大的缺点 1.)将文件放在webroot之外,然后使用readfile向其发送数据。 这就是我目前的设置方式。主要的缺点是我在一个共享服务器上,脚本的最大执行时间是30秒(不能更改),如果文件太大或用户连接太慢,则在下载

我正在制作一个web应用程序,它只允许注册成员从文件夹目录下载zip文件夹

我真的需要知道哪种方法是保护文件夹的正确方法,因为只有存储在我数据库中的成员才能访问它们,所以问题是,如果有人找到了目录和文件名,就没有什么可以阻止他们访问它

我做了一些研究,发现了一些方法,但它们都有很大的缺点

1.)将文件放在webroot之外,然后使用readfile向其发送数据。
这就是我目前的设置方式。主要的缺点是我在一个共享服务器上,脚本的最大执行时间是30秒(不能更改),如果文件太大或用户连接太慢,则在下载完成之前会调用超时

2.)webroot目录中的htaccess和htpasswd

问题是我不想让用户再次输入密码。除非有一种方法允许php发送密码,否则就向需要下载的实际zip文件发送一个头文件

3.)将文件保存在webroot中,但会混淆文件名,使其难以猜测

这真是太差劲了

我真正想做的是将文件保存在web根目录之外,然后只发送一个header:location到该文档以强制下载,显然,因为它不在web根目录中,所以浏览器不会看到它。有办法解决这个问题吗。是否有方法重定向到标题为:location(“/file”)的web外根文件以强制下载。因此,允许apache提供文件服务,而不是使用readfile提供php服务

有没有更简单的方法来保护文件夹并与apache一起服务,我只是没有遇到过?以前有没有人遇到过这个问题,有没有行业标准的方法可以更好地解决这个问题

我知道这可能类似于一个重复的问题,但另一个类似问题的答案都没有提供任何有用的信息来满足我的需要

我真正想做的是将文件保存在web根目录之外,然后只发送一个header:location到该文档以强制下载,显然,因为它不在web根目录中,所以浏览器不会看到它

更重要的是,它位于web根目录之外,因此它没有服务器可以在位置标头中发送的URL

有办法解决这个问题吗。是否有方法重定向到标题为:location(“/file”)的web外根文件以强制下载

不可以。防止服务器简单地移交文件的关键是将其放在web根目录之外。如果您可以重定向到它,那么您将回到“难以猜测的文件名”领域,并且服务器上的每个文件都存在通过HTTP公开的附加安全漏洞

有没有更简单的方法来保护文件夹并使用apache提供服务,这是我没有遇到的

您的选项(其中一些已经以特定实现的形式表示)包括:

  • 使用难以猜测的URL
  • 将文件放在Apache默认情况下不会提供服务的地方,然后编写代码为您提供服务
  • 使用Apache自己的密码保护选项
没有其他方法

有没有更简单的方法来保护文件夹并使用apache提供服务,这是我没有遇到的

不,没有更简单的方法(但也就是说,您描述的三种实现都“非常简单”)


另一种方法,我认为它很脏,但可能会绕过资源约束:

  • 将文件保留在web根目录之外
  • 配置Apache以遵循符号链接
  • 按需:在web根目录下创建一个符号链接,链接到要提供服务的文件
  • 重定向到该符号链接的URI
  • 每5分钟运行一次cron作业以删除旧的符号链接(在符号链接文件名中添加时间戳以帮助完成此操作)

这实际上是我之前项目列表中前两个选项的组合。

谢谢你的回复,昆汀。是的,这三个选项都很简单,我应该用更好的措辞“有更好的方法吗?”。谢谢你对这个问题的澄清。您关于将文件位置放在apache无法使用defualt的位置的第二点很有趣。如果不太麻烦的话,你能澄清一下你的意思吗。正如我所说,我不想使用htacsess psword。而且,一旦知道父目录,难以猜测的文件名不会阻止web裂土器。如果文件位于web根目录中。然后apache将给它一个URI并将其服务器化。如果不是,那么apache就不会了。是的,但在某个时候,我仍然必须公开父目录URI。只是出于对这三条路的兴趣,你会选择哪条路?拥有282k分,你显然知道自己在说什么!通常,我会使用“将文件放在Apache默认情况下无法提供的地方”的方法,并且(如果我一直使用PHP)使用
readfile
方法……但我刚刚看到了您的资源限制(非常紧张).好吧,这对我来说是个很好的总结,非常感谢,我可以继续我的项目了。我讨厌路障!能从做过这件事的人那里得到建议真是太好了!