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

РЕДАКТИРОВАТЬ 1: (2017-10-23)

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

Буньямин Инан
источник
вам просто нужно добавить переписать для вашего нового пути
MagenX
В nginx.conf уже есть много переписанных блоков и блоков try_file . Если вы посмотрите на новую установку Magento 2, вы увидите nginx.conf с большим количеством конфигураций.
Буньямин Инан
@MagenX Можете ли вы объяснить больше, пожалуйста? Где именно я должен положить переписать?
Буньямин Инан

Ответы:

13

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

Вот сценарий. У нас есть два разных сайта, и у каждого сайта есть два разных вида магазина:

Веб-сайт 1

  • Веб-сайт 1 (электронная коммерция)
  • Веб-сайт 1 (Венда Ассистида)

Веб-сайт 2

  • Веб-сайт 2 (электронная коммерция)
  • Веб-сайт 2 (Венда Ассистида)

В моем решении мы собираемся изменить некоторые настройки в Magento Admin . Затем мы собираемся создать несколько подпапок , и, наконец, мы собираемся изменитьnginx.conf .

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

Для конфигурации по умолчанию

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

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

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

Для сайта 2 (электронная коммерция) и сайта 2 (Venda Assistida)

Пожалуйста, предоставьте следующую конфигурацию для всех просмотров магазина Website 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 для статического контента, как описано? Мы протестировали эту конфигурацию с 2 различными клиентами в Magento 2.1.
Буньямин Инан
Да, изменил базовый URL, как описано, и теперь он работает. Спасибо
Аман Алам,
1
@ Буньямин Я следовал тому же методу. Домашняя страница работает, но категория и страница продукта выдают ошибку 404. Любое предложение? Вы можете помочь мне в этом.
Jaimin
1
@Jaimin, используйте приведенный выше код в nginx.conf.sample, а не в nginx.conf. Это исправит вашу проблему.
Умайр Аюб
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;
    }

где первая "/ your / subfolder" может быть изменена на любую ссылку в качестве URL-адреса веб-сайта. ex www.mywebsite.com/stack/magento -> / stack / magento

Затем, чтобы определить код сайта, который будет загружен в этот URL, вы должны создать index.php, написав код сайта здесь:

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

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

Матиас Идальго
источник
Я не понимаю, как это решит мою проблему. Я специально спросил, как использовать несколько веб-сайтов. Вы предлагаете, чтобы этот код мог также использоваться для веб-сайтов?
Буньямин Инан
Вы сказали: «Мы хотели бы использовать подпапки вместо поддоменов». Теперь я обновлю свой ответ, уточнив, где находится каждая конфигурация
Матиас Идальго,
Да, я сказал это. Я также сказал, что хотел бы использовать несколько веб-сайтов с подпапками . Я просто не понимаю, что там делает магазинный код ?
Буньямин Инан
Это было всего лишь предложение, если ваши коды магазина достаточно хороши, вам не нужно разбираться с конфигурацией nginx ... взгляните сейчас на мое объяснение
Матиас Идальго
Итак, вы говорите, что если мой код магазина и код сайта совпадают, это будет работать. У меня также есть несколько магазинов для каждого сайта.
Буньямин Инан
0

в вашем домене .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 rewrite для sub-pathmap $http_host$uri $MAGE_RUN_CODE
MagenX
Я попробовал этот метод, просто дает 404.
themanwhoknowstheman
@MagenX Я видел, что вы предлагаете этот метод в другом посте, однако вы никогда не будете вдаваться в подробности о точных направлениях, чтобы заставить это работать должным образом. Заботиться, чтобы поделиться?
Themanwhoknowstheman
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;
(...)
}
Petit_Nuage
источник