Magento 2: Як налаштувати Nginx для використання декількох веб-сайтів із підпапками


9

Ми хотіли б створити кілька веб-сайтів у Magento 2. Про цю тему є стаття в Офіційній Документації Magento 2 , але спосіб їх опису не підходить для нашого випадку.

Вони пропонують використовувати піддомени для визначення різних веб-сайтів, таких як

  • website1 .magento-site.com
  • website2 .magento-site.com

Ми хотіли б використовувати підпапки замість субдоменів . Щоб навести приклад,

  • magento-site.com/ website1
  • magento-site.com/ website2

Як ми можемо подолати це питання на веб-сервері Nginx?

Моя конфігурація

Я використовую Ubuntu 16.04. Я встановив Nginx і не змінив жодної конфігурації ядра Nginx. Я створив файл magento-site.com.confвсередині /etc/nginx/sites-enabled/magento-site.com.conf.

/etc/nginx/sites-enabled/magento-site.com.conf

server {
    listen 8080;
    server_name magento-site.com;

    set $MAGE_RUN_CODE website1;
    set $MAGE_ROOT /var/www/magento-site.com;
    include /var/www/magento-site.com/nginx.conf;
}

EDIT 1: (2017-10-23)

У мене є кілька магазинів для кожного веб-сайту.


вам просто потрібно додати переписування для нового шляху
MagenX

У nginx.conf вже багато блоків для перезаписів та спробу_файлів . Якщо ви подивитеся на свіжу установку Magento 2, ви побачите nginx.conf з безліччю конфігурацій.
Бунямін Інан

@MagenX Чи можете ви пояснити більше? Куди саме слід поставити переписування?
Бунямін Інан

Відповіді:


13

Я випробував численні способи досягнення цього завдання. Я хотів би подякувати @ matias-hidalgo за його внесок, хоча я не зрозумів його відповіді на першому читанні :).

Ось сценарій. У нас є два різних веб-сайти, і кожен веб-сайт має два різних перегляди магазину таким чином:

Веб-сайт 1

  • Веб-сайт 1 (Електронна комерція)
  • Веб-сайт 1 (Venda Assistida)

Веб-сайт 2

  • Веб-сайт 2 (Електронна комерція)
  • Веб-сайт 2 (Venda Assistida)

У своєму рішенні ми збираємося змінити певну конфігурацію в Magento Admin . Тоді ми збираємося створити кілька підпапок , і нарешті ми будемо змінюватиnginx.conf .

Перш за все, нам потрібно внести деякі зміни конфігурації в Magento Admin . Перейдіть до Stores-> Configuration-> General-> Web. Потрібно змінити базові URL-адреси для кожного перегляду магазину.

Для конфігурації за замовчуванням

Введіть наступну конфігурацію для конфігурації за замовчуванням. введіть тут опис зображення

Для веб-сайту 1 (електронна комерція) та веб-сайту 1 (Venda Assistida)

Будь ласка, надайте таку конфігурацію для всіх переглядів магазину на веб-сайті 1 . введіть тут опис зображення

Для веб-сайту 2 (електронна комерція) та веб-сайту 2 (Venda Assistida)

Будь ласка, надайте таку конфігурацію для всіх переглядів магазину на веб-сайті 2 . введіть тут опис зображення

По-друге, нам потрібно створити website1і website2папки в /pubкаталозі. У фіналі у вас повинні бути такі папки:

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

Скопіюйте pub/index.phpфайл у ці каталоги. Тоді ми внесемо деякі зміни в MAGENTO_ROOT/pub/website1/index.phpі MAGENTO_ROOT/pub/website2/index.php.

Зміст MAGENTO_ROOT/pub/website1/index.php

Я змінив лише 3 рядки:

1-й рядок: require __DIR__ . '/../../app/bootstrap.php';

2-й рядок: $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';

3-й рядок: $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);

Для остаточного дотику нам потрібно внести зміни nginx.confдо вашого каталогу MAGENTO_ROOT. Будь ласка , поставте наступну конфігурацію в ваш 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;
    }
}

Після всіх цих конфігурацій та модифікацій ви зможете використовувати веб-сайти як підпапки. Я сподіваюся, що це допомагає.


1
Єдина проблема, з якою я стикаюся з цією конфіграцією - це статичний вміст не працює
Аман Алам

@AmanAlam Ви змінили базовий URL для статичного вмісту, як описано? Ми протестували цю конфігурацію з двома різними клієнтами в Magento 2.1.
Бунямін Інан

Так, змінили базовий URL-адресу, як описано, і його зараз працюю дякую
Аман Алам

1
@Bunyamin Я дотримувався того ж методу. Домашня сторінка працює, але категорія та сторінка товарів дають помилку 404. Будь-яка пропозиція? чи можете ви мені в цьому допомогти.
Джаймін

1
@Jaimin, використовуйте наведений вище код у nginx.conf.sample, а не в nginx.conf. Це виправить вашу проблему.
umair ayub

2

За допомогою конфігурації Nginx ви можете використовувати цю приклад конфігурації:

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;
    }
}

і використовуйте цей index.php як приклад:

/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);

Для уточнення:

У моїй конфігурації vhost nginx ви знайдете це:

    location /your/subfolder {
        root /your/subfolder;
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /your/subfolder/index.php last;
            break;
        }
        #limit_conn iplimit 50;
    }

де перша "/ ваша / підпапка" може бути змінена на все, що ви хочете, як URL-адресу веб-сайту. ex www.mywebsite.com/stack/magento -> / stack / magento

Тоді для визначення коду веб-сайту, який буде завантажений у цю URL-адресу, потрібно створити index.php, написавши код веб-сайту тут:

$params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website_code';

Я сподіваюся, що це зараз досить зрозуміло, що я повинен витратити час на проект, щоб це зробити, щоб я знав, що це працює, і це ближче, як ми це робили на M1.


Я не розумію, як це вирішить мою проблему. Я спеціально запитав, як використовувати кілька веб-сайтів. Ви припускаєте, що цей код можна використовувати і для веб-сайтів?
Бунямін Інан

Ви сказали: "Ми хотіли б використовувати підпапки замість субдоменів." Я оновлю свою відповідь зараз, уточнюючи, де знаходиться кожен конфігурація Папки
Matias Hidalgo

Так, я це сказав. Я також сказав, що хотів би використовувати кілька веб-сайтів із підпапками . Я просто не розумію, що там робить код магазину ?
Бунямін Інан

Це була лише пропозиція, якщо ваші коди магазину досить хороші, вам не потрібно мати справу з конфігурацією nginx ... подивіться зараз на моє пояснення
Matias Hidalgo

Тож ви говорите, що якщо код мого магазину та код веб-сайту збігаються, це спрацює. У мене також є кілька магазинів для кожного веб-сайту.
Бунямін Інан

0

у вашому domain.conf в "etc / nginx" вам потрібно створити карту.

наприклад:

map $http_host$uri $MAGE_RUN_CODE { 
   ~*^(www\.)?magento-site\.com/website1/.*  website1;
   ~*^(www\.)?magento-site\.com/website2/.*  website2;
}

або

map $request_uri $MAGE_RUN_CODE {
    default default;
    ~^/website1/.*  website1;
    ~^/website2/.*  website2;
}

Ви описуєте спосіб піддомену . Що я хочу - це підпапка . Я не хочу website1.magento-site.com, але хочу magento-site.com/website1.
Бунямін Інан

ви можете зіставити підпапку так само, і додати переписати regex для суб-шляхуmap $http_host$uri $MAGE_RUN_CODE
MagenX

Я спробував цей метод, якраз дає 404.
themwhoknowstheman

@MagenX Я бачив, як ви пропонуєте цей метод на іншій посаді, однак ви ніколи не деталізуєте точні вказівки, щоб правильно працювати. Хочете поділитися?
temanwhoknowstheman

0

Як щодо чистого рішення nginx з цією подвійною картою?

По-перше, для веб-сайту (спасибі @MagenX)

map $request_uri $MAGE_RUN_CODE {
    default website1;
    ~^/website1/.*  website1;
    ~^/website2/.*  website2;
}

Секунда для нового запиту uri

map $request_uri $REQUEST_URI {
    default  $request_uri;
    "~*^/(website[0-9])(?<p>.*)" $p;
}

І, нарешті, не забудьте встановити новий обчислений REQUEST_URI

location ~ \.php$ {
(...)
   include fastcgi_params;
   fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
   fastcgi_param REQUEST_URI $REQUEST_URI;
(...)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.