You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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为例:
    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的实现逻辑完全一致,仅将前缀替换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 13:15:08