3

我做了什么

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

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

当我研究哪一个两个使用时,我遇到了这个堆栈溢出链接。 将文件存储在公共目录和 Laravel 5.4 中存储之间的区别 在上面提到的答案中的这个链接中,

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

例如 public/images/my-image.jpeg,任何人都可以通过以下方式查看存储在其中的图像mysite.com/images/my-image.jpeg

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

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

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

问题

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

这让我想到了两个问题,

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

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

4

2 回答 2

1

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

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

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

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

他是你的答案:

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

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

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

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

于 2021-09-12T08:35:52.217 回答
0

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

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

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

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

于 2021-09-12T08:37:10.783 回答