为同一虚拟主机中的多个 laravel 应用重写规则

Posted

技术标签:

【中文标题】为同一虚拟主机中的多个 laravel 应用重写规则【英文标题】:Rewrite rules for several laravel apps in the same Virtual Host 【发布时间】:2022-01-07 22:59:37 【问题描述】:

我有一个 Apache2 虚拟主机,我将在其中托管多个 Laravel 应用程序。

VH 文档根是/home/user/applications/portal

laravel 应用在:

/home/user/applications/portal/larapps/larapp1
/home/user/applications/portal/larapps/larapp2
...

我希望 URL 是这样的:

http://portal.com/larapp1/...
http://portal.com/larapp2/...

这是我的配置:

<VirtualHost *:80>
    ServerName portal.com
    DocumentRoot /home/user/applications/portal

    Alias /larapp1 /home/user/applications/portal/larapps/larapp1/public
    <Directory /home/user/applications/portal/larapps/larapp1/public>
        RewriteEngine On
        RewriteBase /larapps/larapp1/public/
        RewriteCond %REQUEST_FILENAME !-f
        RewriteCond %REQUEST_FILENAME !-d
        RewriteRule ^.*$ index.php [L]
    </Directory>
</VirtualHost>

如果请求是http://portal.com/larapp1,那么匹配的路由就是我所期望的:Route::get('/',...)

但是,出乎意料的是,如果我在请求中添加任何 URI,它不会做我想要的。例如,如果请求是http://portal.com/larapp1/foo,则它不匹配Route::get('/foo',...),而是匹配Route::get('/larapp1/foo',...)

我应该怎么做才能匹配没有前缀 /larapp1 的路由?

【问题讨论】:

【参考方案1】:

我找到了!我的错,我在配置中犯了一个错误:我在 RewriteBase 中使用了文件系统路径,而我应该指定一个基本 URI。这是正确的配置:

<VirtualHost *:80>
    ServerName portal.com
    DocumentRoot /home/user/applications/portal

    Alias /larapp1 /home/user/applications/portal/larapps/larapp1/public
    <Directory /home/user/applications/portal/larapps/larapp1/public>
        RewriteEngine On
        RewriteBase /larapp1/
        RewriteCond %REQUEST_FILENAME !-f
        RewriteCond %REQUEST_FILENAME !-d
        RewriteRule ^.*$ index.php [L]
    </Directory>
</VirtualHost>

【讨论】:

以上是关于为同一虚拟主机中的多个 laravel 应用重写规则的主要内容,如果未能解决你的问题,请参考以下文章

同一服务器上的 Laravel 4.2 环境

Laravel 4 虚拟主机和 mod 重写设置

单个域上多个 laravel 应用程序的虚拟主机别名

在单个服务器上为多个 Laravel 应用程序使用 Redis 队列

Laravel中从一个表到另一个表中的同一字段的多个外键

如何在 laravel 查询生成器中为同一列构建多个条件的查询?