同一域上的多个 Laravel 5 项目

Posted

技术标签:

【中文标题】同一域上的多个 Laravel 5 项目【英文标题】:Multiple Laravel 5 projects on the same domain 【发布时间】:2016-09-08 15:38:31 【问题描述】:

我有几个 Laravel 5 项目在同一个域的子文件夹上运行。

每个 Laravel 应用程序都在生成它自己的会话 cookie,有时它会生成太多以至于我们在整个域上都会遇到 http 400 错误。

我应该在所有这些项目之间共享存储文件夹,还是有任何设置可以防止这种情况发生?

【问题讨论】:

你不能只使用一个然后使用子域路由并为每个站点使用一个包系统等吗?有点过时,但可以给你一个想法? laracasts.com/discuss/channels/tips/… 我不能,我们真的需要每个项目都放在一个子文件夹中。 对不起,我读的是子域而不是文件夹?对不起 【参考方案1】:

编辑 httpd.conf 文件为

请检查路径可能因您的系统而异/opt/lampp/htdocs//var/www/html/

## Path to laravel sub-folder
Alias /admin-boilerplate/ "/opt/lampp/htdocs/admin-boilerplate/public/"
<Directory "/opt/lampp/htdocs/admin-boilerplate/public">
    AllowOverride All
</Directory>

您可能需要将公用文件夹中的 .htaccess 文件编辑为

RewriteBase /admin-boilerplate

完整代码如下

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %HTTP:Authorization .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_URI (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L]

    # It enables routes when documrnt root set to public foder in httpd.conf file
    # change name according to alias name
    RewriteBase /admin-boilerplate
</IfModule>

【讨论】:

【参考方案2】:

既然找到了解决办法,就和大家分享一下吧。

首先,您需要使用 Redis 或数据库等共享会话驱动程序。

其次,需要在config/session.php上设置,session cookie和路径要一致。

之后,您可以在同一个域上运行尽可能多的不同 Laravel 项目,而不会遇到 cookie 问题。

如果您的应用程序根本不需要会话,您可以在 app/Http/Kernel.php 上完全禁用会话,注释以下行:

\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,

【讨论】:

【参考方案3】:

每个 Laravel 安装都应该位于自己的目录中。

然后需要定义一个别名,将域子文件夹指向“子”Laravel 文件夹。

Apache 中的示例http.conf

<VirtualHost some.domain:80>

    ServerName some.domain

    ## Path to laravel domain
    DocumentRoot "/path/to/some/domain/laravel-1/public"
    <Directory "/path/to/some/domain/laravel-1/public">
        AllowOverride All
    </Directory>

    ## Path to laravel sub-folder
    Alias /laravel-2-path-alias/ "/path/to/some/domain/laravel-2/public"
    <Directory "/path/to/some/domain/laravel-2/public">
        AllowOverride All
    </Directory>

</VirtualHost>

对于会话 cookie,请在两个安装中检查 config\session.php

root安装config\session.php

'cookie' => 'a_unique_name'
'path' => '/',

子文件夹安装config\session.php:

'cookie' => 'another_unique_name'
'path' => '/path/to/sub/folder',

这应该确保每个安装都在编写自己唯一的会话 cookie。子应用程序生成的任何 cookie 都不应干扰父应用程序的 cookie。

【讨论】:

我们的项目已经在运行,问题是关于会话 cookie。 我可以共享同一个会话吗【参考方案4】:

您应该设置 Homestead。它非常易于使用。 https://laravel.com/docs/5.2/homestead 您可以设置多个域,例如:domain1.dev、domain2.dev。对于每个域,您将拥有自己的 cookie。

【讨论】:

我们已经投入生产,我们需要多个子文件夹上的多个项目。【参考方案5】:

我认为您需要为每个子文件夹拥有一个唯一的安全密钥,并为每个子文件夹添加一个特殊变量去更改生成的 cookie

【讨论】:

以上是关于同一域上的多个 Laravel 5 项目的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 和 Wordpress 在同一服务器/域上

如何在同一个域上运行多个 Laravel 实例?

任何域上的 Laravel 5 子域路由

Laravel:如何打开多个域(不是子域)以显示来自同一服务器的页面(无重定向)?

laravel 和 wordpress 在同一个域上(子文件夹中的 laravel)

多个域上的 Node.js 使用 express.vhosts()