Magento 2: So konfigurieren Sie Nginx für die Verwendung mehrerer Websites mit Unterordner

9

Wir möchten mehrere Websites in Magento 2 erstellen. Es gibt einen Artikel zu diesem Thema in der offiziellen Magento 2-Dokumentation , aber die Art und Weise, wie sie beschrieben werden, ist für unseren Fall nicht geeignet.

Sie schlagen vor , zu verwenden , Sub-Domains , um zu verschiedenen Websites zu ermitteln, wie

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

Wir möchten Unterordner anstelle von Unterdomänen verwenden . Um ein Beispiel zu geben:

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

Wie können wir dieses Problem auf dem Nginx-Webserver beheben?

Meine Konfiguration

Ich benutze Ubuntu 16.04. Ich habe Nginx installiert und keine Nginx-Kernkonfiguration geändert. Ich habe eine Datei magento-site.com.confdarin erstellt /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)

Ich habe mehrere Geschäfte für jede Website.

Bunyamin Inan
quelle
Sie müssen nur Umschreibungen für Ihren neuen Pfad hinzufügen
MagenX
In nginx.conf gibt es bereits viele Umschreibungen und try_file-Blöcke . Wenn man sich frische Magento 2 Installation erhalten Sie eine nginx.conf mit vielen Konfigurationen sehen.
Bunyamin Inan
@MagenX Kannst du bitte mehr erklären? Wo genau soll ich das Umschreiben platzieren?
Bunyamin Inan

Antworten:

13

Ich habe zahlreiche Möglichkeiten ausprobiert, um diese Aufgabe zu erfüllen. Ich möchte mich bei @ matias-hidalgo für seine Beiträge bedanken, obwohl ich seine Antwort beim ersten Lesen nicht verstanden habe :).

Hier ist das Szenario. Wir haben zwei verschiedene Websites und jede Website hat zwei verschiedene Store-Ansichten wie folgt:

Website 1

  • Website 1 (E-Commerce)
  • Website 1 (Venda Assistida)

Website 2

  • Website 2 (E-Commerce)
  • Website 2 (Venda Assistida)

In meiner Lösung werden wir einige Konfigurationen in Magento Admin ändern . Dann werden wir einige Unterordner erstellen und schließlich ändernnginx.conf .

Zunächst müssen wir einige Konfigurationsänderungen im Magento Admin vornehmen . Gehen Sie zu Stores-> Configuration-> General-> Web. Wir müssen die Basis-URLs für jede Geschäftsansicht ändern .

Für Standardkonfiguration

Bitte geben Sie die folgende Konfiguration für die Standardkonfiguration an. Geben Sie hier die Bildbeschreibung ein

Für Website 1 (E-Commerce) und Website 1 (Venda Assistida)

Bitte geben Sie die folgende Konfiguration für alle Website 1- Geschäftsansichten an. Geben Sie hier die Bildbeschreibung ein

Für Website 2 (E-Commerce) und Website 2 (Venda Assistida)

Bitte geben Sie die folgende Konfiguration für alle Website 2- Store-Ansichten an. Geben Sie hier die Bildbeschreibung ein

Zweitens müssen wir erstellen website1und website2im Ordner /pubVerzeichnis. Im Finale sollten Sie die folgenden Ordner haben:

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

Kopieren Sie die pub/index.phpDatei in diese Verzeichnisse. Dann werden wir einige Änderungen in MAGENTO_ROOT/pub/website1/index.phpund vornehmen MAGENTO_ROOT/pub/website2/index.php.

Inhalt von MAGENTO_ROOT/pub/website1/index.php

Ich habe nur 3 Zeilen geändert:

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

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

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

Für den letzten Schliff müssen wir nginx.confin Ihrem MAGENTO_ROOT-Verzeichnis Änderungen vornehmen. Bitte geben Sie die folgende Konfiguration in Ihre ein 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;
    }
}

Nach all diesen Konfigurationen und Änderungen können Sie Websites als Unterordner verwenden. Ich hoffe, es hilft.

Bunyamin Inan
quelle
Das einzige Problem, mit dem ich bei dieser Konfigration konfrontiert bin, ist, dass statische Inhalte nicht funktionieren
Aman Alam
@AmanAlam Haben Sie die Basis-URL für statischen Inhalt wie beschrieben geändert? Wir haben diese Konfiguration mit 2 verschiedenen Clients in Magento 2.1 getestet.
Bunyamin Inan
Ja geändert Basis-URL wie beschrieben und es funktioniert jetzt danke
Aman Alam
1
@Bunyamin Ich folgte der gleichen Methode. Die Startseite funktioniert, aber Kategorie und Produktseite geben 404-Fehler aus. Irgendein Vorschlag? Kannst du mir dabei helfen?
Jaimin
1
@Jaimin, verwenden Sie den obigen Code in nginx.conf.sample, nicht in nginx.conf. Es wird Ihr Problem beheben.
Umair Ayub
2

Mit der Nginx-Konfiguration können Sie diese Beispielkonfiguration verwenden:

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

und verwenden Sie diese index.php als Beispiel:

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

Um zu verdeutlichen:

In meiner vhost nginx Konfiguration finden Sie Folgendes:

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

Hier kann der erste "/ your / subfolder" für eine beliebige Website-URL geändert werden. ex www.mywebsite.com/stack/magento -> / stack / magento

Um den Website-Code zu definieren, der in diese URL geladen wird, müssen Sie die index.php erstellen und den Website-Code hier schreiben:

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

Ich hoffe, das ist jetzt klar genug. Ich muss Zeit in einem Projekt verbringen, um dies zu erreichen, damit ich weiß, dass es funktioniert und es näher ist, wie wir es früher auf M1 gemacht haben.

Matias Hidalgo
quelle
Ich verstehe nicht, wie dies mein Problem lösen wird. Ich habe speziell gefragt, wie man mehrere Websites benutzt. Schlagen Sie vor, dass dieser Code auch für Websites verwendet werden kann?
Bunyamin Inan
Sie sagten: "Wir möchten Unterordner anstelle von Unterdomänen verwenden." Ich werde meine Antwort jetzt aktualisieren und klarstellen, wo sich jede Unterordner-Konfiguration befindet
Matias Hidalgo
Ja, das habe ich gesagt. Ich sagte auch, dass ich mehrere Websites mit Unterordnern verwenden möchte . Ich verstehe einfach nicht, was Store-Code dort macht?
Bunyamin Inan
Das war nur ein Vorschlag, wenn Ihre Geschäftscodes gut genug sind, müssen Sie sich nicht mit der Nginx-Konfiguration befassen ... Schauen Sie sich jetzt meine Erklärung an
Matias Hidalgo
Sie sagen also, dass dies funktioniert, wenn mein Geschäftscode und mein Website-Code übereinstimmen. Ich habe auch mehrere Geschäfte für jede Website.
Bunyamin Inan
0

In Ihrer domain.conf in "etc / nginx" müssen Sie eine Karte erstellen.

zum Beispiel:

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

oder

map $request_uri $MAGE_RUN_CODE {
    default default;
    ~^/website1/.*  website1;
    ~^/website2/.*  website2;
}
Leonardo Garcia
quelle
Sie beschreiben den Subdomain- Weg. Was ich will, ist Unterordner Weg. Ich will nicht website1.magento-site.com, aber ich will magento-site.com/website1.
Bunyamin Inan
Sie können Ihren Unterordner auf die gleiche Weise map $http_host$uri $MAGE_RUN_CODE
zuordnen
Ich habe diese Methode ausprobiert, gibt nur eine 404.
themanwhoknowstheman
@MagenX Ich habe gesehen, dass Sie diese Methode in einem anderen Beitrag vorgeschlagen haben, aber Sie gehen nie detailliert auf die genauen Anweisungen ein, damit dies richtig funktioniert. Möchtest du teilen?
themanwhoknowstheman
0

Was ist mit einer reinen Nginx-Lösung mit dieser Doppelkarte?

Zunächst für die Website (danke @MagenX)

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

Eine Sekunde für die neue Anfrage uri

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

Und vergessen Sie nicht, den neu berechneten REQUEST_URI festzulegen

location ~ \.php$ {
(...)
   include fastcgi_params;
   fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
   fastcgi_param REQUEST_URI $REQUEST_URI;
(...)
}
Petit_Nuage
quelle