Laravel应用部署在domain.or/yyy下的URL与路由配置问题
这种Laravel部署在子目录下的问题我碰过好多次,核心就是要让框架知道自己的「根路径」不是域名根目录,而是/yyy。我给你拆解成几个关键步骤来解决:
1. 修正静态资源路径(CSS/JS/图片等)
Laravel的asset()、url()这些辅助函数默认是从域名根目录生成链接的,所以得告诉框架实际的基础URL:
- 打开项目根目录的
.env文件,修改以下两个配置:APP_URL=https://domain.or/yyy ASSET_URL=https://domain.or/yyy - 如果修改后没生效,记得清除配置缓存(生产环境必做):
php artisan config:cache
2. 让所有路由自动带上
/yyy前缀 现在你的路由都是基于根目录的,手动加前缀太麻烦,直接在路由服务提供者里全局配置:
- 打开
app/Providers/RouteServiceProvider.php,找到boot()方法,在parent::boot();后面添加这段代码:Route::prefix('yyy') ->group(base_path('routes/web.php')); - 这样所有
web.php里的路由都会自动带上/yyy前缀,不用一个个改。 - 最后清除路由缓存:
php artisan route:cache
3. 调整
.htaccess适配子目录 你当前的.htaccess是为根目录部署写的,需要添加RewriteBase并修正规则,替换成下面的内容:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 关键:设置重写的基础路径为子目录 RewriteBase /yyy/ # 去除末尾斜杠(如果不是文件夹) RewriteCond %{REQUEST_FILENAME}!-d RewriteRule ^(.*)/$ $1 [L,R=301] # 处理前端控制器(Laravel的入口) RewriteCond %{REQUEST_FILENAME}!-d RewriteCond %{REQUEST_FILENAME}!-f RewriteRule ^ index.php [L] # 处理授权头 RewriteCond %{HTTP:Authorization}. RewriteRule.* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] </IfModule>
4. 确认服务器配置(避免403)
如果还是出现403错误,要检查Apache的站点配置:
- 确保你的子目录(
/yyy对应的服务器物理路径)配置里有AllowOverride All,这样.htaccess的规则才能生效。比如Apache虚拟主机配置里应该有:<Directory "/path/to/your/server/yyy"> AllowOverride All Require all granted </Directory> - 修改后重启Apache服务。
按这几步走下来,静态资源、路由应该都能正常指向domain.or/yyy了,你可以先试试访问首页之外的页面,看看CSS加载和路由跳转是否正常。
内容的提问来源于stack exchange,提问作者ezles88
相关产品推荐
相关产品推荐

