Magento 2: come configurare Nginx per l'uso di più siti Web con sottocartella


9

Vorremmo creare più siti Web in Magento 2. C'è un articolo su questo argomento nella documentazione ufficiale di Magento 2 , ma il modo in cui descrivono non è adatto al nostro caso.

Stanno suggerendo di usare sottodomini per determinare diversi siti Web, come

  • WebSite1 .magento-site.com
  • website2 .magento-site.com

Vorremmo utilizzare le sottocartelle anziché i sottodomini . Per fare un esempio,

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

Come possiamo superare questo problema sul web server Nginx?

La mia configurazione

Sto usando Ubuntu 16.04. Ho installato Nginx e non ho modificato alcuna configurazione di base di Nginx. Ho creato un file magento-site.com.confall'interno /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: (23-10-2017)

Ho più negozi per ogni sito web.


devi solo aggiungere riscritture per il tuo nuovo percorso
MagenX,

Ci sono già molti blocchi di riscrittura e try_file in nginx.conf . Se guardi alla nuova installazione di Magento 2, vedrai un nginx.conf con molte configurazioni.
Bunyamin Inan,

@MagenX Puoi spiegarmi di più per favore? Dove devo mettere esattamente la riscrittura?
Bunyamin Inan,

Risposte:


13

Ho provato numerosi modi per raggiungere questo obiettivo. Vorrei ringraziare @ matias-hidalgo per i suoi contributi, anche se non ho capito la sua risposta a prima lettura :).

Ecco lo scenario. Abbiamo due diversi siti Web e ogni sito Web ha due diverse visualizzazioni del negozio come segue:

Sito web 1

  • Sito Web 1 (E-commerce)
  • Sito Web 1 (Venda Assistida)

Sito web 2

  • Sito Web 2 (E-commerce)
  • Sito Web 2 (Venda Assistida)

Nella mia soluzione, cambieremo alcune configurazioni in Magento Admin . Quindi creeremo alcune sottocartelle e infine modificheremonginx.conf .

Prima di tutto, dobbiamo apportare alcune modifiche alla configurazione in Magento Admin . Vai a Stores-> Configuration-> General-> Web. Dobbiamo modificare gli URL di base per ogni vista dello store.

Per la configurazione predefinita

Fornire la seguente configurazione per la configurazione predefinita. inserisci qui la descrizione dell'immagine

Per il sito Web 1 (e-commerce) e il sito Web 1 (Venda Assistida)

Fornisci la seguente configurazione per tutte le visualizzazioni negozio del sito Web 1 . inserisci qui la descrizione dell'immagine

Per il sito Web 2 (e-commerce) e il sito Web 2 (Venda Assistida)

Fornisci la seguente configurazione per tutte le visualizzazioni dello store del sito Web 2 . inserisci qui la descrizione dell'immagine

In secondo luogo, dobbiamo creare website1e website2cartelle nella /pubdirectory. Nel finale, dovresti avere le seguenti cartelle:

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

Copia il pub/index.phpfile in queste directory. Quindi faremo alcune modifiche in MAGENTO_ROOT/pub/website1/index.phpe MAGENTO_ROOT/pub/website2/index.php.

Il contenuto di MAGENTO_ROOT/pub/website1/index.php

Ho cambiato solo 3 righe:

1a linea: require __DIR__ . '/../../app/bootstrap.php';

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

3a linea: $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);

Per il tocco finale, dobbiamo modificare nginx.confnella tua directory MAGENTO_ROOT. Inserisci la seguente configurazione nel tuo 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;
    }
}

Dopo tutte queste configurazioni e modifiche, sarai in grado di utilizzare i siti Web come sottocartelle. Spero possa essere d'aiuto.


1
L'unico problema che sto affrontando con questa configrazione è che il contenuto statico non funziona
Aman Alam,

@AmanAlam Hai modificato l'URL di base per il contenuto statico come descritto? Abbiamo testato questa configurazione con 2 client diversi in Magento 2.1.
Bunyamin Inan,

Sì, l'URL di base è cambiato come descritto e ora funziona grazie
Aman Alam,

1
@Bunyamin Ho seguito lo stesso metodo. La home page funziona ma la categoria e la pagina del prodotto generano errori 404. Qualche suggerimento? mi potete aiutare in questo.
Jaimin,

1
@Jaimin, utilizzare il codice sopra in nginx.conf.sample non in nginx.conf. Risolverà il tuo problema.
Umair Ayub

2

Con la configurazione di Nginx è possibile utilizzare questa configurazione di esempio:

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

e usa questo index.php come esempio:

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

Al fine di chiarire:

Nella mia configurazione nginx del vhost troverai questo:

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

dove la prima "/ tua / sottocartella" può essere cambiata per quello che vuoi come URL del sito web. ex www.mywebsite.com/stack/magento -> / stack / magento

Quindi, al fine di definire il codice del sito Web che verrà caricato in questo URL, è necessario creare index.php scrivendo qui il codice del sito Web:

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

Spero che questo sia abbastanza chiaro, devo passare del tempo in un progetto per farlo, quindi so che funziona ed è più vicino a come lo facevamo su M1.


Non capisco come questo risolverà il mio problema. Ho chiesto specificamente come utilizzare più siti Web. Stai suggerendo che questo codice può essere utilizzato anche per i siti Web?
Bunyamin Inan,

Hai detto "Vorremmo utilizzare le sottocartelle anziché i sottodomini". Aggiornerò la mia risposta ora chiarendo dove si trova ciascuna configurazione della sottocartella
Matias Hidalgo,

Sì, l'ho detto. Ho anche detto che vorrei utilizzare più siti Web con sottocartelle . Non capisco cosa ci faccia lì il codice negozio ?
Bunyamin Inan,

Era solo un suggerimento, se i codici del tuo negozio sono abbastanza buoni non hai bisogno di gestire la configurazione di nginx ... dai un'occhiata ora alla mia spiegazione
Matias Hidalgo,

Quindi stai dicendo che se il mio codice negozio e il codice sito web corrispondono, funzionerà. Ho anche più negozi per ogni sito web.
Bunyamin Inan,

0

nel tuo domain.conf in "etc / nginx" devi creare una mappa.

per esempio:

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

o

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

Stai descrivendo il modo del sottodominio . Quello che voglio è il modo sottocartella . Non voglio website1.magento-site.com, ma voglio magento-site.com/website1.
Bunyamin Inan,

puoi mappare la tua sottocartella allo stesso modo e aggiungere regex rewrite per il sotto-percorsomap $http_host$uri $MAGE_RUN_CODE
MagenX

Ho provato questo metodo, dà solo un 404.
themanwhoknowstheman il

@MagenX Ti ho visto suggerire questo metodo su un altro post, tuttavia non vai mai nei dettagli sulle indicazioni esatte per farlo funzionare correttamente. Vuoi condividere?
themanwhokststman

0

Che dire di una soluzione nginx pura con questa doppia mappa?

Innanzitutto, per il sito Web (grazie @MagenX)

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

Un secondo per la nuova richiesta uri

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

Infine, non dimenticare di impostare il nuovo REQUEST_URI calcolato

location ~ \.php$ {
(...)
   include fastcgi_params;
   fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
   fastcgi_param REQUEST_URI $REQUEST_URI;
(...)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.