Laravel如何禁止未授权用户访问/public目录下的指定子目录
可行解决方案
完全可以实现你要的效果,以下是两种生产环境常用的方案:
方案1:和Laravel权限体系打通(最灵活,推荐)
这个方案可以直接复用你现有Laravel项目的登录、权限校验逻辑,适合需要给已登录授权用户开放访问的场景。
- 第一步:调整Web服务器配置,让目标子目录的所有请求都不走静态资源直接返回逻辑,转发到Laravel的
public/index.php处理。
如果你用Nginx,在你的站点配置里加一条规则(把protected_dir换成你实际的子目录名):
如果你用Apache,在location ^~ /protected_dir/ { try_files $uri $uri/ /index.php?$query_string; }public/.htaccess里加:RewriteRule ^protected_dir/(.*)$ index.php [L] - 第二步:添加对应的路由和权限中间件,在
routes/web.php里加以下代码:// 把protected_dir换成你的实际子目录名,auth中间件可以换成你自己的权限校验中间件 Route::get('protected_dir/{path}', function ($path) { // 拼接文件的实际路径 $filePath = public_path("protected_dir/{$path}"); // 校验文件是否存在 if (!file_exists($filePath)) { abort(404); } // 返回文件响应,大文件可加缓存头优化性能 return response()->file($filePath)->header('Cache-Control', 'public, max-age=31536000'); })->where('path', '.*')->middleware('auth'); // 这里的auth中间件可以换成你自定义的权限校验规则 - 第三步:测试,未登录用户访问
/protected_dir会被跳转到登录页,登录授权用户可以正常访问index.html和加载配套的静态资源。
方案2:用Web服务器自带的基础认证(不需要改Laravel代码,适合简单场景)
如果不需要和Laravel的用户体系打通,只是要加个账号密码校验,可以直接用Nginx/Apache的基础认证功能:
- 第一步:生成密码文件,你可以用htpasswd工具生成,比如:
按提示输入密码后会生成加密的密码文件,注意这个文件不要放到public目录下,避免被公开访问。htpasswd -c /path/to/.htpasswd 你的用户名 - 第二步:配置Nginx规则(替换成你的实际子目录和密码文件路径):
如果是Apache的话,直接在你要保护的子目录下新建location ^~ /protected_dir/ { auth_basic "Restricted Access"; auth_basic_user_file /path/to/.htpasswd; }.htaccess文件,写入:AuthType Basic AuthName "Restricted Access" AuthUserFile /path/to/.htpasswd Require valid-user - 第三步:测试,访问子目录时会弹出账号密码输入框,输入正确的账号密码才能访问所有内容。
注意:两种方案都可以保证index.html正常渲染,配套的css、js、图片资源只要路径正确都会跟着走同样的校验逻辑,不会出现样式丢失的问题。
内容的提问来源于stack exchange,提问作者Volodymyr Shtyka
相关产品推荐
相关产品推荐

