从 public/storage 到 storage/app/public 的符号链接仍然使 storage 目录中的文件可以从 Web 访问

Posted

技术标签:

【中文标题】从 public/storage 到 storage/app/public 的符号链接仍然使 storage 目录中的文件可以从 Web 访问【英文标题】:Symbolic link from public/storage to storage/app/public still makes the files in the storage directory accessible from the web 【发布时间】:2021-11-07 23:06:44 【问题描述】:

我做了什么

当我研究在 laravel 中存储文件时。我遇到了两种方法。

    将资产直接存储在公用文件夹中。 创建从public/storage 到的符号链接 storage/app/public

当我研究哪一个两个使用时,我遇到了这个堆栈溢出链接。 ??? Difference between storing files in public directory and in storage in Laravel 5.4 在上面提到的答案中的这个链接中,

公共文件夹意味着文件可以公开访问。

例如存储在 public/images/my-image.jpeg可以被任何人查看 去mysite.com/images/my-image.jpeg

但是,存储在 storage 目录中的文件仅供您的 应用程序。

????因为,包括上面提到的堆栈溢出帖子,以及我在不同平台上阅读的许多其他帖子,都暗示public 目录中的文件可以通过网络访问,而storage 目录中的文件则不能,我试图通过将文件同时存储在public 目录和storage 目录中,一次一个,然后检查这些文件是否可以通过 Web url 访问来测试这一点。 我的尝试如下,

    首先我在公共中添加了路径images/ 目录并放置一些图像(让我们说 test1.jpgtest2.jpgtest3.jpg) 进入该目录。然后在我的刀片里面 我的 src 属性的模板 img 标签我称它们为 URL('images/test1.jpg') 等等……他们确实是 呈现在网页上。然后我也尝试从 网址通过去 http://localhost:8000/images/test.jpg。结果是 正如预期的那样,图像在网页上呈现 + 它们是 从网址访问 然后我运行命令php artisan storage:link 在控制台上,根据我阅读的文章,应该 在目录之间创建symbolic link public/storagestorage/app/public。 运行命令后,我得到了一个名为的新文件夹 storage 创建于 public 目录。然后我把我所有的图片都移到了那个 public/storage 目录。然后设置 src 将我的 img 标记为 URL('storage/test1.img') 等等...图片是 呈现在网页上。然后我试图检查图像是否 仍然可以从 url 访问。为此,我去了网址栏 http://localhost:8000/storage/test1.jpg该 图片仍然可以从网址访问。

问题

但是,根据我提到的答案和其他一些类似的链接,我希望这些图像无法从上面 2) 中的 url 访问,因为这些图像现在实际上应该在我们创建的 storage/app/public 中指向public/storage 的符号链接。 (storage 目录中的文件不应该公开访问吗?) 这让我想到了两个问题,

    为什么即使在我创建了从public/storagestorage/app/public 的符号链接并将图像存储在public/storage 目录中之后,仍然可以从URL 访问图像? 就像我的情况一样,如果 public/storage 仍然可以通过网络访问 url,实际创建符号链接有什么好处? 它似乎没有提供更多的安全性,因为文件是 仍然可以从 url 访问。

如果有人能帮助我理解上述两个问题的答案,那将非常有帮助。谢谢。

【问题讨论】:

【参考方案1】:

发生在你身上的是预期的行为。

Laravel 存储的目的是与您的本地文件交互并利用 Laravel 助手,此外还可以在部署之间轻松共享。 说我会避免将您的文件直接移动到您的公用文件夹。

另一方面,通过将文件添加到您的 storage/app/public 文件夹,您假设这些文件将可以公开访问,但直到您创建一个符号链接,它是一种特殊类型的文件,指向另一个文件。 当您创建符号链接时,您是在说“嘿,如果用户到达 http://localhost:8000/storage/,只需显示存储在 storage/app/public 中的文件”

因此,如果您想要私人文件(并且您已经创建了一个符号链接),请不要将它们上传到您的 storage/app/public 文件夹,而不是将您的私人文件从公共文件夹中取出,例如 storage/app/myfiles

他是你的答案:

1 - 为什么仍然可以从 url 访问图像 在我创建了一个从公共/存储到的符号链接之后 storage/app/public 并将图像存储在 public/storage 目录?

因为事实上,您已经为此目的创建了一个符号链接,使 storage/app/public 可以公开访问。

2 - 就像我的情况一样,如果公共/存储中的文件是 仍然可以通过网址访问,有什么优点 实际创建符号链接?它似乎没有提供任何 更安全,因为仍然可以从 url 访问文件。

如前所述,优点是利用 Laravel 文件系统。公共链接不能确定您文件的隐私

【讨论】:

【参考方案2】:

您可能在一个项目中有许多不同类型的文件。有些是公众可以访问的,例如嵌入在网站中的图像(如您的示例所示),有些是私人文件,例如私人报告的 pdf。

任何可供公众访问的文件都可以存储在 storage/public 中或直接存储在 public 中。正如您所观察到的,没有区别,因为前者会建立一个符号链接。

但是,私有文件不能存储/公共存储(如果建立了符号链接),尤其是不能直接存储在公共文件夹中,原因很明显。

这些文件可以放在 storage/app/NOT_PUBLIC_REPO 中。这些文件应该可以通过受保护的路由访问(如果您需要额外的保护,还可以使用签名路由)。

【讨论】:

以上是关于从 public/storage 到 storage/app/public 的符号链接仍然使 storage 目录中的文件可以从 Web 访问的主要内容,如果未能解决你的问题,请参考以下文章

配置文件图片的 Laravel Spark 符号链接不起作用

Laravel 存储符号链接图像视图

Laravel 存储文件未下载(未找到文件)

如何使用 laravel 和 vuejs 下载文件

使用 bigquery 下载 sentinel-2 数据

laravel 裁剪器问题不显示全尺寸图像?