如何通过.htaccess实现点击链接直接加载多版本Laravel项目?
多Laravel项目部署问题解决
问题场景
尝试用.htaccess搭建多版本Laravel项目站点,首页index.html代码:
<body> <ul> <li> <a href="Projects/Project1/">Project1</a> </li> <li> <a href="Projects/Project2/">Project2</a> </li> <li> <a href="Projects/Project3/">Project3</a> </li> </ul> </body>
每个项目的.env配置(以Project1为例):
APP_URL=http://127.0.0.1:8000/AllProjects/Projects/Project1/
每个项目根目录.htaccess代码:
<IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ /public/index.php [L] </IfModule>
点击链接后仅显示目录列表,无法加载Laravel站点。
问题原因
- .htaccess规则使用绝对路径
/public/index.php,会指向服务器根目录的public文件,而非当前项目目录下的入口文件 - 未禁用目录索引,导致优先显示目录结构而非跳转入口文件
修复步骤
1. 修改项目根目录的.htaccess
替换每个项目根目录的.htaccess内容为:
<IfModule mod_rewrite.c> Options -MultiViews -Indexes RewriteEngine On # 将所有请求转发到当前项目的public目录 RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] </IfModule>
-Indexes:禁止目录列表显示,避免暴露文件结构- 规则会把当前项目的所有请求重定向到自身的public目录,交由Laravel默认的public/.htaccess处理路由
2. 保留public目录的默认.htaccess
确保每个项目的public目录下存在Laravel默认的.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] # 所有请求转发到index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
这个文件是Laravel处理路由的核心,不要删除或修改默认规则。
3. 配置Apache服务器
- 启用
mod_rewrite模块:执行a2enmod rewrite(Linux环境),然后重启Apache服务 - 修改网站根目录的Apache配置,确保
AllowOverride设置为All:
<Directory "/path/to/your/AllProjects"> AllowOverride All Require all granted </Directory>
只有AllowOverride All才能让.htaccess的规则生效。
4. 验证.env配置
确认每个项目的APP_URL正确,同时建议将APP_ENV设置为production:
APP_URL=http://127.0.0.1:8000/AllProjects/Projects/Project1/ APP_ENV=production
修改后执行php artisan config:clear清除配置缓存(如果是CLI环境)。
内容的提问来源于stack exchange,提问作者Ana Fernandes
相关产品推荐
相关产品推荐

