Maciej Swic
Maciej Swic

Reputation: 11359

Deploying the same Laravel codebase for multiple HTTP hosts on the same server

I have written a backend in Laravel which I need to deploy twice on the same physical server. I need to use two different databases for these, but as they are on the same server I cannot use the built-in host detection in Laravel.

For the moment, I have "fixed" the issue by wrapping my configuration files in this code:

if ($_SERVER["HTTP_HOST"] === "example.com") {
    return config array...
} else if ($_SERVER["HTTP_HOST"] === "example.net") {
    return config array...
}

But this breaks artisan, so no more php artisan down|up or php artisan cache:clear.

There must be a better way to achieve this, no?

Upvotes: 0

Views: 506

Answers (1)

Dan Smith
Dan Smith

Reputation: 5685

By default Laravel uses your hostname, as you say - however you can also pass a closure to the detectEnvironment method to use more complex logic to set your environment.

Something like this, for example:

$env = $app->detectEnvironment(function()
{
    // if statements because staging and live used the same domain,
    // and this app used wildcard subdomains. you could compress this 
    // to a switch if your logic is simpler.
    if (isset($_SERVER['HTTP_HOST']))
    {
        if (ends_with($_SERVER['HTTP_HOST'], 'local.dev'))
        {
            return 'local';
        }

        if (ends_with($_SERVER['HTTP_HOST'], 'staging.server.com'))
        {
            return 'staging';
        }

        if (ends_with($_SERVER['HTTP_HOST'], 'server.com'))
        {
            return 'production';
        }

        // Make sure there is always an environment set.
        throw new RuntimeException('Could not determine the execution environment.');
    }
});

This doesn't deal with artisan, however - HTTP_HOST won't be set there. If the different sites are running under different users you can do another separate switch statement using $_SERVER['USER'] for example. If not you could also use the path of the install as a way to differentiate.

Upvotes: 2

Related Questions