配置Apache在现有应用旁部署Laravel应用的问题排查
1. 修正Apache重写规则
你当前的RewriteRule ^/v2/(.*) /website/v2/p2/public/index.php [L]存在两个问题:
- 无法匹配不带斜杠的
/v2根路径 - 没有把请求的具体路径传递给Laravel,导致Laravel无法识别路由
另外原有的全局RewriteCond会干扰所有后续规则,需要给Laravel的规则单独设置判断条件。修改后的重写规则部分如下:
RewriteEngine on # 处理Laravel的/v2路径 RewriteCond %{REQUEST_URI} ^/v2(/.*)?$ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/v2(/.*)?$ /website/v2/p2/public/index.php/$1 [L] # 原有规则保持不变 RewriteRule ^/api/media/(.*) /data/$1 [L] RewriteRule ^/api/v1/* /api/v1/index.php [L] RewriteRule ^/api/cdn/v1/* /api/cdn/v1/index.php [L] RewriteRule ^/assets/(.*) /website/v1/content/assets/$1 [L] RewriteRule ^/css/(.*) /website/v1/content/css/$1 [L] RewriteRule ^/js/(.*) /website/v1/content/js/$1 [L] RewriteRule ^/fonts/(.*) /website/v1/content/fonts/$1 [L] RewriteRule ^/\.well-known/acme-challenge/(.*)$ /.well-known/acme-challenge/$1 [L] RewriteRule ^/* /website/v1/index.php [L]
关键改动说明:
- 用
^/v2(/.*)?$同时匹配/v2和/v2/xxx所有类型的请求 - 重写目标设置为
/website/v2/p2/public/index.php/$1,将请求的路径部分(比如/newroute)传递给Laravel - 给Laravel的规则单独添加条件判断,避免全局条件影响其他原有规则
2. 配置Laravel的路径前缀
因为所有Laravel请求都通过/v2前缀进入,需要让Laravel识别这个前缀,有两种实现方式:
方式一:给路由组添加前缀
直接在routes/web.php中,把所有v2的路由包裹进前缀组:
Route::prefix('v2')->group(function () { Route::get('/', function () { return "Laravel v2 主页"; }); Route::get('/newroute', function () { return "It works, lol"; }); });
这样访问/v2就能匹配根路由,/v2/newroute也能正常访问你定义的路由。
方式二:全局配置前缀(更省心)
在.env文件中添加以下配置:
APP_URL=https://MyDomain.com/v2 ASSET_URL=https://MyDomain.com/v2
然后打开app/Providers/RouteServiceProvider.php,在boot方法中给web路由设置全局前缀:
public function boot() { $this->routes(function () { Route::middleware('web') ->prefix('v2') ->group(base_path('routes/web.php')); }); }
这样所有web路由会自动带上v2前缀,无需修改routes/web.php里的路由定义,直接访问/v2/newroute就能匹配你写的/newroute路由。
3. 检查Laravel目录权限
确保/home/myuser/MyDomain/src/website/v2/p2/public目录,以及storage、bootstrap/cache这两个核心目录拥有Apache进程的读写权限,否则Laravel无法正常运行。
4. 清除Laravel缓存
修改配置后,执行以下命令清除路由和配置缓存:
cd /home/myuser/MyDomain/src/website/v2/p2 php artisan route:clear php artisan config:clear
问题根源说明
从你的重写日志可以看出,请求确实已经到达Laravel的index.php,但Laravel接收到的请求路径是/(因为没有传递路径部分),而你的路由中没有定义/的路由,同时/newroute也没有添加前缀,导致Laravel找不到对应路由,最终返回404错误。
内容的提问来源于stack exchange,提问作者sanjihan

