从 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.jpg
、test2.jpg
和
test3.jpg
) 进入该目录。然后在我的刀片里面
我的 src
属性的模板
img
标签我称它们为
URL('images/test1.jpg')
等等……他们确实是
呈现在网页上。然后我也尝试从
网址通过去
http://localhost:8000/images/test.jpg
。结果是
正如预期的那样,图像在网页上呈现 + 它们是
从网址访问
然后我运行命令php artisan storage:link
在控制台上,根据我阅读的文章,应该
在目录之间创建symbolic link
public/storage
和 storage/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/storage
到storage/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 访问的主要内容,如果未能解决你的问题,请参考以下文章