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

Posted

技术标签:

【中文标题】Laravel:如何打开多个域(不是子域)以显示来自同一服务器的页面(无重定向)?【英文标题】:Laravel: How to open multiple domains (not subdomains) to show pages (no redirection) from same server? 【发布时间】:2018-08-04 14:51:32 【问题描述】:

我有一个 Laravel 项目托管在一个域上,比如:example.com。 我有几个客户域,比如 client1.com、client2.com 等。 我需要有一个系统(比如 apache 配置),如果有人键入 client1.com,它应该显示来自 example.com/client1.com 的页面

【问题讨论】:

投反对票的人,请您在这里回复为什么需要投反对票? 如果缺乏研究是我得到这个的原因:***.com/questions/16353159/… 但这不能回答我的问题,因此我在这里问。 你试过什么?你想显示什么样的页面?这对 Laravel 有什么特别之处?您要重定向还是透明地重写 URL? 你不能把域指向同一个DNS记录并使用http_host来检查当前打开的域吗? 我正在使用单个 Laravel 应用程序@PraneethNidarshan 【参考方案1】:

您正在做的事情看起来很老套,您可能想尝试另一种方法,但是如果您坚持这种方法并且不想发出重定向,您可能想尝试使用 Apache 作为代理。试试这样的虚拟主机:

<VirtualHost *:80>
    ServerName client1.com
    ProxyPassMatch "^/(.*)$" "http://example.com/client1.com/$1"
</VirtualHost>

我还没有测试过,但它应该会给你一个想法。

这种机制不会重写响应的正文,因此您可能会遇到多个问题,例如链接中的 url。确保内部客户端应用程序使用相对 url。

【讨论】:

【参考方案2】:

您想要做的事情需要 2 个步骤。第一个是告诉 Apache 将域指向同一个 Laravel 应用程序。

<VirtualHost *:80>
    ServerName example.com
    ServerAlias client1.com, client2.com, client3.com
    DocumentRoot /path/to/your/laravel/public/
    <Directory "/path/to/your/laravel/public/">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

一旦您的所有客户端域都指向同一个 Laravel 应用程序,您就可以读取控制器中的服务器名称并将服务器名称传递给您的视图。像这样的:

<?php
class YourController extends Controller

    public function index(Client $client)
    
        $domain =  $_SERVER['SERVER_name'];
        return view('my.view', ['client' => $domain]);
    

在您访问 client1.com/foo/bar 后,$domain 变量将具有 client1.com

【讨论】:

【参考方案3】:
RewriteEngine on
RewriteCond %HTTP_HOST ^client1\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/client1.com/ [R=301,L]

这应该可以解决问题。您可以将其直接添加到您的客户端 apache 配置或在每个客户端 webroot 上创建一个 .htaccess 文件。两种方式都可以解决问题。

【讨论】:

【参考方案4】:

一旦你有从客户端域到域的重定向 在 apache 站点配置 example.com.conf(都在同一个文件中)试试这个。或者你可以通过基于 IP (Apache Source) 来实现

Listen 80

<VirtualHost *:80>
    DocumentRoot "/www/example/client1/"
    ServerName client1.com
    ServerAlias www.client1.com
    #Server Options
    #Directory Options
    #Log Options
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/www/example/client2/"
    ServerName client2.com
    ServerAlias www.client2.com
    #Server Options
    #Directory Options
    #Log Options
</VirtualHost>

【讨论】:

这将需要同一系统的 2 个单独副本。我了解目标是为不同的域使用相同的页面或相同的代码。 这并不适用于他的配置。 from client1.com to example.com/client1 from client2.com to example.com/client2 Apache 应该根据客户端名称提供的 ServerName/Alias 重定向到正确的文件夹。如果这不起作用,那么我需要按照 Apache 源代码中的说明使用 IP 重定向。【参考方案5】:

由于您有一个包含多个域的 Laravel 应用程序,我建议您按照以下步骤解决您的问题。

Apache 中的域配置:

ServerName dev.laravel.com
ServerAlias dev.laravel-client1.com dev.laravel-client2.com

Laravel 应用程序路由配置:

适用于:dev.laravel-client1.com

Route::domain('dev.laravel-client1.com')->group(function () 
    /* client2 domain routes here */
    Route::get('/', function () 
        return view('client1');
    );

    Route::get('/something', function () 
        return "Something at client 1";
    );
);

适用于:dev.laravel-client2.com

Route::domain('dev.laravel-client2.com')->group(function () 
    /* client2 domain routes here */
    Route::get('/', function () 
        return view('client2');
    );
);

注意:这不是无限域的推荐方法

【讨论】:

以上是关于Laravel:如何打开多个域(不是子域)以显示来自同一服务器的页面(无重定向)?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 Dotenv 用于特定子域

任何域上的 Laravel 5 子域路由

Laravel 多域会话

无法使用 Laravel 4 与子域共享会话

如何配置 nginx 来托管多个子域

同一域上的多个 Laravel 5 项目