Magento 2: Jak skonfigurować Nginx do korzystania z wielu stron internetowych z podfolderem


9

Chcielibyśmy stworzyć wiele stron internetowych w Magento 2. W oficjalnej dokumentacji Magento 2 znajduje się artykuł na ten temat , ale sposób, w jaki opisują, nie jest odpowiedni w naszym przypadku.

Sugerują użycie subdomen w celu ustalenia różnych stron internetowych, takich jak

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

Chcielibyśmy używać podfolderów zamiast subdomen . Dać przykład,

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

Jak możemy rozwiązać ten problem na serwerze Nginx?

Moja konfiguracja

Używam Ubuntu 16.04. Zainstalowałem Nginx i nie zmieniłem żadnej konfiguracji rdzenia Nginx. Utworzyłem plik w magento-site.com.confśrodku /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;
}

EDYCJA 1: (2017-10-23)

Mam wiele sklepów dla każdej strony internetowej.


musisz tylko przepisać nową ścieżkę
MagenX

W nginx.conf jest już wiele zapisów i bloków try_file . Jeśli spojrzysz na świeżą instalację Magento 2, zobaczysz plik nginx.conf z wieloma konfiguracjami.
Bunyamin Inan

@MagenX Czy możesz wyjaśnić więcej? Gdzie dokładnie powinienem przepisać?
Bunyamin Inan,

Odpowiedzi:


13

Próbowałem wielu sposobów, aby osiągnąć to zadanie. Chciałbym podziękować @ matias-hidalgo za jego wkład, chociaż nie rozumiałem jego odpowiedzi przy pierwszym czytaniu :).

Oto scenariusz. Mamy dwie różne witryny i każda z nich ma dwa różne widoki sklepu, jak następuje:

Strona internetowa 1

  • Witryna 1 (e-commerce)
  • Strona internetowa 1 (Venda Assistida)

Strona internetowa 2

  • Witryna 2 (e-commerce)
  • Strona internetowa 2 (Venda Assistida)

W moim rozwiązaniu zamierzamy zmienić konfigurację w Magento Admin . Następnie utworzymy niektóre podfoldery , a na koniec zmodyfikujemynginx.conf .

Przede wszystkim musimy wprowadzić zmiany w konfiguracji w Magento Admin . Przejdź do Stores-> Configuration-> General-> Web. Musimy zmienić podstawowe adresy URL dla każdego widoku sklepu.

Dla domyślnej konfiguracji

Podaj następującą konfigurację dla konfiguracji domyślnej. wprowadź opis zdjęcia tutaj

Dla witryny 1 (e-commerce) i witryny 1 (Venda Assistida)

Podaj następującą konfigurację dla wszystkich widoków sklepu Witryny 1 . wprowadź opis zdjęcia tutaj

Dla witryny 2 (e-commerce) i witryny 2 (Venda Assistida)

Podaj następującą konfigurację dla wszystkich widoków sklepu Witryny 2 . wprowadź opis zdjęcia tutaj

Po drugie, musimy utworzyć website1i website2foldery w /pubkatalogu. Ostatecznie powinieneś mieć następujące foldery:

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

Skopiuj pub/index.phpplik do tych katalogów. Następnie wprowadzimy zmiany w MAGENTO_ROOT/pub/website1/index.phpi MAGENTO_ROOT/pub/website2/index.php.

Zadowolony z MAGENTO_ROOT/pub/website1/index.php

Zmieniłem tylko 3 linie:

1. linia: require __DIR__ . '/../../app/bootstrap.php';

2. linia: $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';

3. linia: $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);

W celu ostatecznego ulepszenia musimy zmodyfikować nginx.confw katalogu MAGENTO_ROOT. Wprowadź następującą konfigurację do swojego 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;
    }
}

Po wszystkich tych konfiguracjach i modyfikacjach będziesz mógł używać stron internetowych jako podfolderów. Mam nadzieję, że to pomoże.


1
Jedynym problemem, przed którym stoję z tą konfiguracją, jest to, że zawartość statyczna nie działa
Aman Alam,

@AmanAlam Czy zmieniłeś podstawowy adres URL zawartości statycznej zgodnie z opisem? Testowaliśmy tę konfigurację z 2 różnymi klientami w Magento 2.1.
Bunyamin Inan

Tak, zmieniłem podstawowy adres URL zgodnie z opisem i działa teraz dziękuję
Aman Alam

1
@Bunyamin I zastosowałem tę samą metodę. Strona główna działa, ale strona kategorii i produktu podaje błąd 404. Jakieś sugestie? czy możesz mi w tym pomóc.
Jaimin

1
@Jaimin, użyj powyższego kodu w nginx.conf.sample, a nie w nginx.conf. Naprawi to twój problem.
umair ayub

2

W konfiguracji Nginx możesz użyć tej przykładowej konfiguracji:

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

i użyj tego index.php jako przykładu:

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

W celu wyjaśnienia:

W mojej konfiguracji vgin nginx znajdziesz:

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

gdzie pierwszy „/ twój / podfolder” można zmienić dla dowolnego adresu URL witryny. np. www.mywebsite.com/stack/magento -> / stack / magento

Następnie, aby zdefiniować kod strony, który zostanie załadowany do tego adresu URL, musisz utworzyć index.php, pisząc kod strony tutaj:

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

Mam nadzieję, że teraz jest to wystarczająco jasne, muszę poświęcić czas na projekt, aby to zrobić, więc wiem, że to działa i jest bliżej, jak to robiliśmy na M1.


Nie rozumiem, jak to rozwiąże mój problem. W szczególności zapytałem, jak korzystać z wielu witryn. Sugerujesz, że ten kod może być również używany na stronach internetowych?
Bunyamin Inan,

Powiedziałeś „Chcielibyśmy używać podfolderów zamiast subdomen”. Zaktualizuję teraz swoją odpowiedź, wyjaśniając, gdzie jest każda konfiguracja podfolderu
Matias Hidalgo,

Tak, powiedziałem to. Powiedziałem również, że chciałbym korzystać z wielu stron internetowych z podfolderami . Po prostu nie rozumiem, co tam robi kod sklepu ?
Bunyamin Inan,

To była tylko sugestia, jeśli twoje kody sklepu są wystarczająco dobre, nie musisz zajmować się konfiguracją nginx ... spójrz teraz na moje wyjaśnienie
Matias Hidalgo,

Mówisz więc, że jeśli mój kod sklepu i kod strony pasują do siebie, to zadziała. Mam również wiele sklepów dla każdej strony internetowej.
Bunyamin Inan

0

w domenie.conf w pliku „etc / nginx” musisz utworzyć mapę.

na przykład:

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

lub

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

Opisujesz sposób subdomeny . To, czego chcę, to sposób na podfoldery . Nie chcę website1.magento-site.com, ale chcę magento-site.com/website1.
Bunyamin Inan

możesz zmapować swój podfolder w ten sam sposób i dodać przepisywanie map $http_host$uri $MAGE_RUN_CODE
wyrażeń

Wypróbowałem tę metodę, po prostu daje 404.
wiadomo

@MagenX Widziałem, jak sugerujesz tę metodę w innym poście, jednak nigdy nie wchodzisz w szczegółowe informacje na temat dokładnych wskazówek, aby uzyskać prawidłowe działanie. Chcesz się podzielić?
themanwhoknowstheman

0

Co powiesz na czyste rozwiązanie Nginx z tą podwójną mapą?

Najpierw za stronę internetową (dzięki @MagenX)

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

Sekundę dla nowego uri żądania

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

I na koniec, nie zapomnij ustawić nowego obliczonego REQUEST_URI

location ~ \.php$ {
(...)
   include fastcgi_params;
   fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
   fastcgi_param REQUEST_URI $REQUEST_URI;
(...)
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.