如何在cPanel服务器上配置支持多子域名的Laravel应用?
解决cPanel上Laravel多子域名路由配置问题
你遇到的核心问题是cPanel中子域名的文档根目录配置错误,导致子域名请求没有经过Laravel的前端控制器(index.php)处理,直接展示了对应文件夹的内容。下面是一步步的解决方案:
1. 修正cPanel子域名的文档根目录
在cPanel创建子域名时,默认会自动生成对应文件夹(比如test.mydomain.com会指向public_html/test),但这不符合Laravel多域名路由的需求。我们需要让所有子域名和主域名共享同一个Laravel项目的public目录:
- 登录cPanel,找到「子域名」管理选项
- 找到你创建的
test.mydomain.com,点击「编辑」或「管理」按钮 - 将「文档根目录」修改为和主域名完全一致的路径,比如你的Laravel项目放在
public_html下,路径就是/home/你的用户名/public_html/public(可以查看主域名的文档根配置确认具体路径) - 保存修改
2. 确保public目录的.htaccess配置正确
Laravel默认的public/.htaccess已经能处理路由转发,但如果之前有修改过,确保它包含以下内容(没有的话直接新建):
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 处理授权头 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 移除末尾斜杠(非文件夹请求) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 将所有请求转发到前端控制器 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
这个配置会把所有非文件、非文件夹的请求都转发到index.php,让Laravel来解析你的域名路由规则。
3. 清除Laravel缓存
为了确保新的路由规则生效,登录服务器终端(或使用cPanel的「终端」工具),进入Laravel项目根目录,运行以下命令:
php artisan route:cache php artisan config:cache
这会清除旧的路由和配置缓存,让Laravel加载最新的路由逻辑。
4. 测试验证
现在访问test.mydomain.com,应该会显示你路由中定义的DOMAIN TEST.MYDOMAIN.COM;主域名mydomain.com也会正常展示对应内容,问题就解决了。
额外注意事项
- 如果你的Laravel项目不是放在
public_html根目录(比如放在public_html/laravel-app),文档根目录需要改为/home/你的用户名/public_html/laravel-app/public - 确保服务器开启了
mod_rewrite模块(cPanel中一般默认开启,若未开启可在「Apache模块」中启用)
内容的提问来源于stack exchange,提问作者João
相关产品推荐
相关产品推荐

