如何在 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/ 中的特定目录?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 如何不在控制器中传递未使用的参数

如何在雄辩的 Laravel 中使用名称查找条目?

仅在 Laravel 中公开某些身份验证路由

如果关系项不在 Laravel 的请求中,则删除它

如何在 laravel 的公共目录中使用会话

在我的 android 应用程序中为社区公开使用 Facebook,而不在 Playstore 上发布它