从 public/storage 到 storage/app/public 的符号 link 仍然使存储目录中的文件可以从网络访问

Symbolic link from public/storage to storage/app/public still makes the files in the storage directory accessible from the web

我做了什么

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

  1. 将资产直接存储在 public 文件夹中。
  2. 正在创建符号 link 从 public/storagestorage/app/public

当我研究哪一个两个使用时,我遇到了这个堆栈溢出 link。 在这个 link 的最佳答案中提到,

Public folder means files will be publicly accessible.

For example an image stored in public/images/my-image.jpegcan be viewed by anyone by going to mysite.com/images/my-image.jpeg

However, files stored in storage directory are only available to your app.

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

  1. 首先我在 public 中添加了路径 images/ 目录并放置一些图像(让我们说 test1.jpgtest2.jpgtest3.jpg) 到那个目录。然后在我的 blade 我的 src 属性的模板 img 个标签,我将它们称为 URL('images/test1.jpg') 等......他们确实是 呈现在网页上。然后我也尝试访问图像 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.
  3. 访问

问题

但是,根据我提到的答案和其他一些类似的 links,我预计这些图像无法从上面 2) 中的 url 访问,因为图像现在应该实际上在 storage/app/public 中我们创建了一个符号 link 到 public/storage。 (storage 目录中的文件不应该 public 可以访问,对吗?)

这让我想到了两个问题,

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

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

您的情况符合预期。

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

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

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

他就是你的答案:

1 - Why are the images are still being accessible from the url even after I created a symbolic link from public/storage to storage/app/public and stored the images in the public/storage directory?

因为事实上,您为此目的创建了一个符号 link,使 storage/app/public public 易于访问。

2 - As happened with my case, if the files in the public/storage are still accessible through the web url, what are the advantages of actually creating the symbolic link? It does not seem to offer any more security since the files are still accessible from the url.

如前所述,优点是可以利用 Laravel 文件系统。 public link 不决定您文件的隐私

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

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

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

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