Apache+CentOS7下单域名子路径部署多Laravel应用的安全实现方法
你当前的实现方案存在明确的安全风险:Laravel项目的核心源码(包含存储数据库账号、第三方服务密钥的.env配置文件、应用核心逻辑代码)全部放置在Apache可直接对外提供HTTP访问的/var/www/html路径下,攻击者只需通过域名拼接路径(比如访问mydomain.com/firstapp/.env)即可下载到全部敏感配置,极易造成核心数据泄露。
以下是适配CentOS7、Apache环境的标准化安全实现方案,可完全满足同域名通过子路径访问两个Laravel应用的需求,同时从根源上隔离敏感源码。
第一步:重构安全目录结构,隔离可访问内容与源码
- 先把原来放在/var/www/html/firstapp、/var/www/html/secondapp下的完整Laravel源码,移动到web根目录之外的非公开路径,比如统一放在/var/www/apps目录下,最终两个应用的核心源码路径为:
/var/www/apps/firstapp、/var/www/apps/secondapp。该目录对Apache的运行用户(apache)保留读、执行权限,但不存在于web可访问的URL路径下,无法通过HTTP请求读取。 - 仅将两个Laravel应用原public目录下的对外可访问内容(入口index.php、静态资源文件、.htaccess规则文件),分别保留在/var/www/html/firstapp、/var/www/html/secondapp路径下,作为对外的站点入口目录。
- 这种结构的核心优势是敏感源码完全脱离web可访问路径,不需要依赖.htaccess规则做拦截,从架构层面消除敏感文件泄露的可能,比单纯靠规则拦截的方案更可靠。
第二步:修正应用入口的关联路径
- 编辑
/var/www/html/firstapp/index.php,将原来指向本地目录的autoload、应用实例引入路径,修改为指向外部源码的绝对路径:// 替换原来基于__DIR__的本地关联路径 require '/var/www/apps/firstapp/vendor/autoload.php'; $app = require_once '/var/www/apps/firstapp/bootstrap/app.php'; - 以同样方式修改
/var/www/html/secondapp/index.php,将路径替换为/var/www/apps/secondapp下的对应文件。 - 给外部源码的可写目录设置正确权限,执行以下命令给两个应用的storage、bootstrap/cache目录开放apache用户的写入权限,避免Laravel运行时的权限报错:
chown -R apache:apache /var/www/apps/firstapp/storage /var/www/apps/firstapp/bootstrap/cache chown -R apache:apache /var/www/apps/secondapp/storage /var/www/apps/secondapp/bootstrap/cache
第三步:适配Laravel子路径的路由与资源加载
- 给两个应用配置静态资源的基础路径:编辑对应应用根目录(
/var/www/apps/firstapp、/var/www/apps/secondapp)下的.env文件,分别添加资源路径配置:
firstapp的.env添加:ASSET_URL=/firstapp
secondapp的.env添加:ASSET_URL=/secondapp - 修改两个应用的全局路由前缀,避免路由匹配错乱:编辑对应应用的
app/Providers/AppServiceProvider.php文件,在boot方法中为路由绑定固定前缀,以firstapp为例:
secondapp的实现逻辑完全一致,仅将前缀替换为public function boot() { // 为web路由绑定/firstapp前缀 \Route::prefix('firstapp')->group(base_path('routes/web.php')); // 如使用api路由,同步绑定前缀 \Route::prefix('firstapp')->group(base_path('routes/api.php')); }secondapp即可。 - 两个入口子目录(
/var/www/html/firstapp、/var/www/html/secondapp)下的.htaccess文件保留Laravel默认的重写规则即可,确保所有子路径下的非静态资源请求都能传递给对应入口的index.php处理。
第四步:Apache 虚拟主机配置加固
- 编辑Apache的虚拟主机配置,放开/var/www/html目录的.htaccess规则解析权限,同时关闭目录遍历,避免泄露站点结构:
<VirtualHost *:80> DocumentRoot "/var/www/html/" ServerName mydomain.com <Directory "/var/www/html"> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost> - 配置修改完成后,执行以下命令重载Apache配置使其生效:
systemctl restart httpd - 兜底安全规则:在/var/www/html目录下的.htaccess文件中添加规则,禁止所有以.env开头的文件被直接访问,作为敏感文件访问的兜底防护。
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

