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.