You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:13:26