Apache2+Laravel通配符子域名路由问题:主域名无法渲染index.php
Apache通配符SSL配置下顶级域名无法渲染index.php的解决方案
这个方案在Apache环境下完全可行,不需要切换到Nginx,问题出在配置细节上,以下是具体排查和修复步骤:
1. 修正Apache目录权限配置
你的default-ssl.conf中Directory节点指向了/var/www/project,但DocumentRoot是/var/www/project/public,权限配置必须对应到Laravel的入口目录,否则.htaccess规则无法生效。修改后的配置片段:
ServerName project.app ServerAlias *.project.app DocumentRoot /var/www/project/public <Directory /var/www/project/public> Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted # Apache 2.4+推荐使用该指令替代旧的Order/allow规则 </Directory>
2. 补全Laravel顶级域名路由
你只配置了子域名的路由规则,顶级域名需要对应路由才能渲染内容,添加以下代码到路由文件:
// 顶级域名首页路由 Route::domain('project.app')->group(function () { Route::view('/', 'pages.home'); // 替换为你的首页视图或控制器 }); // 或者使用默认路由(未指定domain的路由会匹配顶级域名请求) // Route::view('/', 'pages.home');
3. 完善public目录下的.htaccess规则
当前.htaccess缺少Laravel核心的URL重写规则,导致请求无法转发到index.php,替换为完整规则:
RewriteEngine On # 将HTTP请求强制跳转至HTTPS RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 处理127.0.0.1跳转(保留原有规则) RewriteCond %{HTTP_HOST} ^127\.0\.0\.1 RewriteRule (.*) https://project.app/$1 [R=301,L] # Laravel核心重写:将所有非文件/目录请求指向index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
4. 确保Apache必要模块启用
执行以下命令启用重写和SSL模块,然后重启服务:
sudo a2enmod rewrite ssl sudo systemctl restart apache2
5. 检查80端口站点配置(可选)
如果存在非SSL的000-default.conf配置,需确保顶级域名和子域名同样指向public目录并强制跳转HTTPS,避免配置冲突:
ServerName project.app ServerAlias *.project.app DocumentRoot /var/www/project/public RewriteEngine On RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
完成以上步骤后,Apache即可正常处理顶级域名和通配符子域名的请求,无需切换到Nginx。
内容的提问来源于stack exchange,提问作者Leland Ayton
相关产品推荐
相关产品推荐

