Magento 2: Multiple websites and stores on apache or nginx server

The question:

I know this question may have been previously asked but I followed many reference links, but I cannot do this thing so please help me achieve it.
base URL = http://127.0.0.1/magento22/

1) Create a site in Magento with 4 languages

  • Deutschland (German)
  • Francais (French)
  • Nederland (Dutch)
  • Switzerland (Swiss)

2) Change code in index.php

<?php
/**
 * Application entry point
 *
 * Example - run a particular store or website:
 * --------------------------------------------
 * require __DIR__ . '/app/bootstrap.php';
 * $params = $_SERVER;
 * $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'website2';
 * $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website';
 * $bootstrap = MagentoFrameworkAppBootstrap::create(BP, $params);
 * /** @var MagentoFrameworkAppHttp $app */
 * $app = $bootstrap->createApplication(MagentoFrameworkAppHttp::class);
 * $bootstrap->run($app);
 * --------------------------------------------
 *
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

try {
    require __DIR__ . '/app/bootstrap.php';
} catch (Exception $e) {
    echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
    <div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;">
        <h3 style="margin:0;font-size:1.7em;font-weight:normal;text-transform:none;text-align:left;color:#2f2f2f;">
        Autoload error</h3>
    </div>
    <p>{$e->getMessage()}</p>
</div>
HTML;
    exit(1);
}
$params = $_SERVER;
$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
switch ($actual_link) 
{
    case 'http://127.0.0.1/magento22/deutschland/':
        $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'deutschland'; 
        $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website'; 
        break; 
    case 'http://127.0.0.1/magento22/france/':
        $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'france'; 
        $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website'; 
         echo "11";
        break; 
    case 'http://127.0.0.1/magento22/nederland/':
        $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'nederland'; 
        $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website'; 
        break; 
    case 'http://127.0.0.1/magento22/switzerland/':
        $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'switzerland'; 
        $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website'; 
        break; 
    case 'http://127.0.0.1/magento22/':
        $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'base'; 
        $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website'; 
        break;     
    default: 
        $params = $_SERVER;
        break; 

}

$bootstrap = MagentoFrameworkAppBootstrap::create(BP, $params);
/** @var MagentoFrameworkAppHttp $app */
$app = $bootstrap->createApplication(MagentoFrameworkAppHttp::class);
$bootstrap->run($app);

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

Created multi website in magento, Steps to create a multistore in admin panel is same as like in magento1.x. Don’t forget to change the base url and secure url for new website/store. Once made changes in admin panel follow the below steps,

1) Create a new folder in magento root and copy the index.php and .htaccess files from magento root to new folder.

2) Edit the index.php which is in new folder

Replace:

$bootstrap = MagentoFrameworkAppBootstrap::create(BP, $_SERVER);

/** @var MagentoFrameworkAppHttp $app */

$app = $bootstrap->createApplication('MagentoFrameworkAppHttp');

$bootstrap->run($app);

With:

 $params = $_SERVER;

 $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'newstore'; //Webite code as same in admin panel

 $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website';

 $bootstrap = MagentoFrameworkAppBootstrap::create(BP, $params);

 /** @var MagentoFrameworkAppHttp $app */

 $app = $bootstrap->createApplication('MagentoFrameworkAppHttp');

 $bootstrap->run($app);

And also update bootstrap.php include path as below,

Replace:

require __DIR__ . '/app/bootstrap.php';

With:

require __DIR__ . '/../app/bootstrap.php';

3) Create a simlinks inside the new folder

 ln -s /home/example/example.com/html/app/ app 

 ln -s /home/example/example.com/html/lib/ lib 

 ln -s /home/example/example.com/html/pub/ pub 

 ln -s /home/example/example.com/html/var/ var 

Refer this

Please clear the var/generation,var/cache and pub/static files and do the static content deployment.

enter image description here

enter image description here

Final Step:-store->configuration->general->web->select store view and add base URL for Each Store

Method 2

If The Server Is NGINX then Follow Below Steps.

Here is the scenario. We have two different websites, and each website has two different store views as follows:

Website 1

  • Website 1 (E-commerce)
  • Website 1 (Venda Assistida)

Website 2

  • Website 2 (E-commerce)

  • Website 2 (Venda Assistida)

In my solution, we are going to change some configuration in Magento Admin. Then we are going to create some sub-folders, and finally we are going to modify nginx.conf.

First of all, we need to make some configuration change in the Magento Admin. Go to Stores -> Configuration -> General -> Web. We need to change Base URLs for each store view.

For Default Config
Please provide the following configuration for default config.

enter image description here

For Website 1 (E-commerce) and Website 1 (Venda Assistida)

Please provide the following configuration for all Website 1 store views.

enter image description here

For Website 2 (E-commerce) and Website 2 (Venda Assistida)

Please provide the following configuration for all Website 2 store views.

enter image description here

Secondly, we need to create website1 and website2 folders in the /pub directory. In the final, you should have the following folders:

  • MAGENTO_ROOT/pub/website1
  • MAGENTO_ROOT/pub/website2

Copy the pub/index.php file into these directories. Then we will make some changes in MAGENTO_ROOT/pub/website1/index.php and MAGENTO_ROOT/pub/website2/index.php.

Content of MAGENTO_ROOT/pub/website1/index.php
I have only changed 3 lines:

1st Line: require __DIR__ . '/../../app/bootstrap.php';

2nd Line: $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'website1';

3rd Line: $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website';

<?php
/**
 * Public alias for the application entry point
 *
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

use MagentoFrameworkAppBootstrap;
use MagentoFrameworkAppFilesystemDirectoryList;

try {
    require __DIR__ . '/../../app/bootstrap.php';
} catch (Exception $e) {
    echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
    <div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;">
        <h3 style="margin:0;font-size:1.7em;font-weight:normal;text-transform:none;text-align:left;color:#2f2f2f;">
        Autoload error</h3>
    </div>
    <p>{$e->getMessage()}</p>
</div>
HTML;
    exit(1);
}

$params = $_SERVER;
$params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'website1';
$params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website';
$params[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] = [
    DirectoryList::PUB => [DirectoryList::URL_PATH => ''],
    DirectoryList::MEDIA => [DirectoryList::URL_PATH => 'media'],
    DirectoryList::STATIC_VIEW => [DirectoryList::URL_PATH => 'static'],
    DirectoryList::UPLOAD => [DirectoryList::URL_PATH => 'media/upload'],
];

$bootstrap = MagentoFrameworkAppBootstrap::create(BP, $params);
/** @var MagentoFrameworkAppHttp $app */
$app = $bootstrap->createApplication(MagentoFrameworkAppHttp::class);
$bootstrap->run($app);

For the final touch, we need to modify nginx.conf in your MAGENTO_ROOT directory. Please put the following configuration into your nginx.conf.

location /website1 {
    root /website1;
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /website1/index.php last;
        break;
    }
}

location /website2 {
    root /website2;
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /website2/index.php last;
        break;
    }
}

After all this configurations and modifications, you will be able to use websites as sub-folders.

Method 3

Check with below code

<?php
/**
 * Application entry point
 *
 * Example - run a particular store or website:
 * --------------------------------------------
 * require __DIR__ . '/app/bootstrap.php';
 * $params = $_SERVER;
 * $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'website2';
 * $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website';
 * $bootstrap = MagentoFrameworkAppBootstrap::create(BP, $params);
 * /** @var MagentoFrameworkAppHttp $app */
 * $app = $bootstrap->createApplication(MagentoFrameworkAppHttp::class);
 * $bootstrap->run($app);
 * --------------------------------------------
 *
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

try {
    require __DIR__ . '/app/bootstrap.php';
} catch (Exception $e) {
    echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
    <div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;">
        <h3 style="margin:0;font-size:1.7em;font-weight:normal;text-transform:none;text-align:left;color:#2f2f2f;">
        Autoload error</h3>
    </div>
    <p>{$e->getMessage()}</p>
</div>
HTML;
    exit(1);
}

$params = $_SERVER;
$params[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] = [
    DirectoryList::PUB => [DirectoryList::URL_PATH => ''],
    DirectoryList::MEDIA => [DirectoryList::URL_PATH => 'media'],
    DirectoryList::STATIC_VIEW => [DirectoryList::URL_PATH => 'static'],
    DirectoryList::UPLOAD => [DirectoryList::URL_PATH => 'media/upload'],
];

//$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
switch ($_SERVER['HTTP_HOST'])
{
    case 'http://127.0.0.1/magento22/deutschland/':
        $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'deutschland';
        $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website';
        break;
    case 'http://127.0.0.1/magento22/france/':
        $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'france';
        $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website';
        echo "11";
        break;
    case 'http://127.0.0.1/magento22/nederland/':
        $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'nederland';
        $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website';
        break;
    case 'http://127.0.0.1/magento22/switzerland/':
        $params[MagentoStoreModelStoreManager::PARAM_RUN_CODE] = 'switzerland';
        $params[MagentoStoreModelStoreManager::PARAM_RUN_TYPE] = 'website';
        break;
}

$bootstrap = MagentoFrameworkAppBootstrap::create(BP, $_SERVER);
/** @var MagentoFrameworkAppHttp $app */
$app = $bootstrap->createApplication(MagentoFrameworkAppHttp::class);
$bootstrap->run($app);


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment