Magento 2: How to configure Nginx to use multiple websites with sub-folder
I have tried numerous ways to achieve this task. I would like to thank @matias-hidalgo for his contributions, although I did not understand his answer at first read :).
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.
For Website 1 (E-commerce) and Website 1 (Venda Assistida)
Please provide the following configuration for all Website 1 store views.
For Website 2 (E-commerce) and Website 2 (Venda Assistida)
Please provide the following configuration for all Website 2 store views.
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[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';
3rd Line: $params[\Magento\Store\Model\StoreManager::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 Magento\Framework\App\Bootstrap;
use Magento\Framework\App\Filesystem\DirectoryList;
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[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';
$params[\Magento\Store\Model\StoreManager::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 = \Magento\Framework\App\Bootstrap::create(BP, $params);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication(\Magento\Framework\App\Http::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. I hope it helps.
By Nginx configuration you can use this example configuration:
server {
listen 80;
## SSL directives might go here
server_name local.magento2.com;
root /PATH/TO/YOUR/MAGENTO/pub;
location / {
index index.html index.php; ## Allow a static html file to be shown first
try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
expires 30d; ## Assume all files are cachable
}
location /your/subfolder {
root /your/subfolder;
if (!-e $request_filename) {
rewrite ^/(.*)$ /your/subfolder/index.php last;
break;
}
#limit_conn iplimit 50;
}
location @handler { ## Magento uses a common front handler
rewrite / /index.php;
}
location /static/ {
# Uncomment the following line in production mode
# expires max;
# Remove signature of the static files that is used to overcome the browser cache
location ~ ^/static/version {
rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
}
location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
add_header Cache-Control "public";
add_header X-Frame-Options "SAMEORIGIN";
expires +1y;
if (!-f $request_filename) {
rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
}
}
location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
add_header Cache-Control "no-store";
add_header X-Frame-Options "SAMEORIGIN";
expires off;
if (!-f $request_filename) {
rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
}
}
if (!-f $request_filename) {
rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
}
add_header X-Frame-Options "SAMEORIGIN";
}
location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler
rewrite ^(.*.php)/ $1 last;
}
location ~ .php$ { ## Execute PHP scripts
if (!-e $request_filename) {
rewrite / /index.php last;
}
expires off;
#fastcgi_pass unix:/run/php/php5.6-fpm.sock;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_read_timeout 10m;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fastcgi_param MAGE_RUN_CODE $mage_run_code;
#fastcgi_param MAGE_RUN_TYPE store;
#fastcgi_param MAGE_MODE developer; # default or production or developer
include /etc/nginx/fastcgi_params;
}
}
and use this index.php as an example:
/PATH/TO/YOUR/MAGENTO/pub/your/subfolder/index.php
<?php
use Magento\Framework\App\Bootstrap;
use Magento\Framework\App\Filesystem\DirectoryList;
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'],
];
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website_code';
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_TYPE] = 'website';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params);
$app = $bootstrap->createApplication('Magento\Framework\App\Http');
$bootstrap->run($app);
In order to clarify:
In my vhost nginx configuration you will find this:
location /your/subfolder {
root /your/subfolder;
if (!-e $request_filename) {
rewrite ^/(.*)$ /your/subfolder/index.php last;
break;
}
#limit_conn iplimit 50;
}
where the first "/your/subfolder" can be changed for whatever you want as website url. ex www.mywebsite.com/stack/magento -> /stack/magento
Then in order to define the website code which will be loaded into this url you have to create the index.php writing the website code here:
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website_code';
I hope this now is clear enough, I've to spend time in a project to get this done so I know it works and it's closer as how we used to do it on M1.