如何在 Laravel 中公开一个不在 public/ 中的特定目录?
Posted
技术标签:
【中文标题】如何在 Laravel 中公开一个不在 public/ 中的特定目录?【英文标题】:How to expose a specific directory that is not in public/ - in Laravel? 【发布时间】:2021-07-18 09:36:35 【问题描述】:我正在进行一个非常古老的 Laravel 4.2 项目。出于安全原因,我将所有文件存储在/app/files/
。我想让我的一个目录公开访问,这个/app/files/logo_path/
。
假设...我有一个文件 cat.png
位于
Ex. /app/files/logo_path/cat.png
我希望我的域像这样返回它domain.com/logo_path/cat.png
。
我应该使用routes.php
还是nginx configuration
来解决这个问题?
基本上,我想将所有图像从/app/files/logo_path/*
映射到domain.com/logo_path/*
【问题讨论】:
你可以尝试类似php artisan storage:link
的东西
【参考方案1】:
使用 nginx,可以通过以下配置实现:
location ^~ /logo_path/
root /app/files; # you should specify full path to /app/files folder here!
我假设您在 /app/files/logo_path/
中除了图像之外没有任何其他文件,这就是为什么我使用 ^~
位置修饰符来防止任何尝试从该路径请求任何 PHP 脚本的原因(如果这样的请求来了,它不会被 PHP 处理程序位置拦截并被 PHP-FPM 引擎解释)。
此配置不是安全漏洞,因为此位置块仅用于以 /logo_path/
前缀开头的请求。如果您想使用不同的前缀,root
指令将不适合您,在这种情况下,您需要使用 alias
指令。以下是 nginx 文档的摘录:
比如下面的配置
location /i/ root /data/w3;
/data/w3/i/top.gif
文件将被发送以响应/i/top.gif
请求。...
文件的路径仅通过将 URI 添加到根指令的值来构建。如果必须修改 URI,则应使用
alias
指令。
【讨论】:
location ^~ /logo_path/ root /app/files/logo_path/;
我想你的意思是……/app/files/logo_path
我试过了,我现在还是 404。我也重启了nginx。
我需要放全路径吗?
是的,您需要根文件夹的完整路径(例如 /var/www/...
)。
这不是一个安全漏洞,正如我所说,这个 location
块将仅用于 /logo_path/...
请求,但您可以仔细查看 alias
和 @987654324 之间的区别@ 指令。【参考方案2】:
nginx配置就是解决这个问题的方法。通过 php 传递这些静态图像对象并没有什么好处除非您只想将它们显示给授权的站点访问者。
nginx 在传递静态对象方面比 php 更快。它 mmaps 对象的文件到 RAM,然后 sends 它们到浏览器。快!
【讨论】:
以上是关于如何在 Laravel 中公开一个不在 public/ 中的特定目录?的主要内容,如果未能解决你的问题,请参考以下文章