laravel - 从 public/storage 到 storage/app/public 的符号链接(symbolic link)仍然使存储目录中的文件可以从网络访问

标签 laravel laravel-8 laravel-artisan laravel-storage laravel-filesystem

我做了什么

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

  1. 将 Assets 直接存储在公共(public)文件夹中。
  2. 创建从 public/storage存储/应用/公共(public)

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

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.

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

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

问题

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

这让我想到了两个问题,

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

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

最佳答案

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

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

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

所以如果你想要私有(private)文件(并且你已经创建了一个符号链接(symbolic link))就不要将它们上传到你的 storage/app/public 文件夹,而不是把你的私有(private)文件从公用文件夹,例如 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?

因为事实上,您已经为此目的创建了一个符号链接(symbolic link),使 storage/app/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)链接不能确定您文件的隐私

关于laravel - 从 public/storage 到 storage/app/public 的符号链接(symbolic link)仍然使存储目录中的文件可以从网络访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69149411/

相关文章:

php - 更新以前的 session 数组 Laravel

laravel - Laravel 中具有自定义属性的自定义验证消息

php - MySql - 如何使用分组依据计算查询的计数(*)?

php - Laravel 8 404 Not Found 页面返回 ubuntu 18 和 apache 上的所有路由

php - 在 laravel 8 中收到名为 '' Class 'Database\Seeders\App\Models\Product' not found'' 的错误

php - 拉拉维尔 8 : Target class does not exist

laravel - 如何使用命令行清除laravel中的缓存?

Laravel 5 php artisan 未在 Vagrant 中运行,缺少供应商/services.json?

php - Laravel artisan 错误 :processutils

javascript - 按传单喜欢 Laravel 5.2 订购