Laravel 拒绝访问 /public 目录

Posted

技术标签:

【中文标题】Laravel 拒绝访问 /public 目录【英文标题】:Laravel deny access to /public directory 【发布时间】:2021-10-19 11:27:33 【问题描述】:

有人可以回答我: 在 laravel 中是否可以拒绝访问公用文件夹中的目录? 我了解公共目录中的所有内容都是公开的。但我需要在 /public 目录中放置一个文件夹,并将 index.html 文件放在其中,其中包含一些 css、js、图像。我需要正确显示 index.html 并防止未经授权的用户查看它。 如果有任何答案,我将不胜感激。

【问题讨论】:

【参考方案1】:

尝试根据您的要求设置该特定文件夹的权限。

简单设置:

chmod -R 权限文件夹路径/文件夹名称

您可以查看此链接以了解用于哪些权限的组合。 chmodcommand.com

【讨论】:

【参考方案2】:

问题是,/public 中的静态文件不是由 laravel 处理的,而是由您的服务器软件直接提供的。

如果您使用的是 apache2,您可以拒绝访问公共子文件夹,您可以在拒绝访问的目录中放置 .htaccess 文件:

public/custom/.htaccess

order deny,allow
deny from all

问题是,除非您使用基本身份验证,否则您无法授权外部访问这些文件。


为了处理复杂的授权并且不破坏 laravel 约定,我会将这些文件放在resources(甚至storage/app)内的文件夹中

resources
 |  custom
 |   | index.html
 |   | image.png
 |   | script.js
 |   | style.css

然后,在您的 web.php 中为原始文件夹中的所有内容创建通用路由:

Route::get('/custom/file?', [CustomFilesController::class, 'getFile'])

在控制器/路由内部,您可以:

执行您的授权 从资源(或存储)文件夹中检索文件 使用适当的内容类型标头响应它们

【讨论】:

非常感谢您的详细解答!至于目录 /public,我知道所有内容都在公共访问中,laravel 无法控制它。至于将文件夹放在不同的目录中,我已经这样做了。例如,放在目录/storage 中。但问题是css、js和图片文件没有显示,返回404错误。也许我没有正确地提供 index.html 文件。使用方法:File::get($path . '/index.html') 这样你只提供 index.html 文件。您应该收到所需的文件名作为输入并相应地返回

以上是关于Laravel 拒绝访问 /public 目录的主要内容,如果未能解决你的问题,请参考以下文章

无法打开流或文件:无法打开流:权限被拒绝

Laravel 显示错误拒绝用户访问

Laravel:SQLSTATE [28000] [1045] 用户 'homestead'@'localhost' 的访问被拒绝

用户 'user'@'localhost' Laravel 5.8 的访问被拒绝

在 laravel 5 中,用户 'homestead@localhost' 的访问被拒绝

在 laravel 4.2 中,用户 'root'@'localhost' 的 Laravel 访问被拒绝(使用密码:YES)