Magento 2: Comment configurer Nginx pour utiliser plusieurs sites Web avec un sous-dossier


9

Nous aimerions créer plusieurs sites Web dans Magento 2. Il y a un article sur ce sujet dans la documentation officielle de Magento 2 , mais la façon dont ils décrivent ne convient pas à notre cas.

Ils suggèrent d'utiliser des sous-domaines afin de déterminer différents sites Web, tels que

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

Nous aimerions utiliser des sous-dossiers au lieu de sous-domaines . Pour donner un exemple,

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

Comment pouvons-nous surmonter ce problème sur le serveur Web Nginx?

Ma configuration

J'utilise Ubuntu 16.04. J'ai installé Nginx et je n'ai modifié aucune configuration principale de Nginx. J'ai créé un fichier à l' magento-site.com.confintérieur /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)

J'ai plusieurs magasins pour chaque site Web.


il vous suffit d'ajouter des réécritures pour votre nouveau chemin
MagenX

Il y a déjà beaucoup de réécritures et de blocs try_file dans nginx.conf . Si vous regardez une nouvelle installation de Magento 2, vous verrez un nginx.conf avec beaucoup de configurations.
Bunyamin Inan

@MagenX Pouvez-vous expliquer plus s'il vous plaît? Où dois-je mettre la réécriture exactement?
Bunyamin Inan

Réponses:


13

J'ai essayé de nombreuses façons d'accomplir cette tâche. Je tiens à remercier @ matias-hidalgo pour ses contributions, même si je n'ai pas compris sa réponse à la première lecture :).

Voici le scénario. Nous avons deux sites Web différents, et chaque site Web a deux vues de magasin différentes comme suit:

Site Web 1

  • Site Web 1 (commerce électronique)
  • Site Web 1 (Venda Assistida)

Site Web 2

  • Site Web 2 (commerce électronique)
  • Site Web 2 (Venda Assistida)

Dans ma solution, nous allons changer une configuration dans Magento Admin . Ensuite, nous allons créer des sous-dossiers , et enfin nous allons modifiernginx.conf .

Tout d'abord, nous devons apporter des modifications à la configuration dans Magento Admin . Allez dans Stores-> Configuration-> General-> Web. Nous devons modifier les URL de base pour chaque vue de magasin.

Pour la configuration par défaut

Veuillez fournir la configuration suivante pour la configuration par défaut. entrez la description de l'image ici

Pour le site Web 1 (commerce électronique) et le site Web 1 (Venda Assistida)

Veuillez fournir la configuration suivante pour toutes les vues du magasin du site Web 1 . entrez la description de l'image ici

Pour le site Web 2 (commerce électronique) et le site Web 2 (Venda Assistida)

Veuillez fournir la configuration suivante pour toutes les vues de magasin du site Web 2 . entrez la description de l'image ici

En second lieu , nous devons créer website1et website2dossiers dans le /pubrépertoire. Au final, vous devriez avoir les dossiers suivants:

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

Copiez le pub/index.phpfichier dans ces répertoires. Ensuite, nous apporterons quelques modifications dans MAGENTO_ROOT/pub/website1/index.phpet MAGENTO_ROOT/pub/website2/index.php.

Contenu de MAGENTO_ROOT/pub/website1/index.php

Je n'ai changé que 3 lignes:

1ère ligne: require __DIR__ . '/../../app/bootstrap.php';

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

3e ligne: $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);

Pour la touche finale, nous devons modifier nginx.confdans votre répertoire MAGENTO_ROOT. Veuillez mettre la configuration suivante dans votre 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;
    }
}

Après toutes ces configurations et modifications, vous pourrez utiliser des sites Web comme sous-dossiers. J'espère que ça aide.


1
Le seul problème auquel je suis confronté avec cette configration est que le contenu statique ne fonctionne pas
Aman Alam

@AmanAlam Avez-vous modifié l'URL de base pour le contenu statique comme décrit? Nous avons testé cette configuration avec 2 clients différents dans Magento 2.1.
Bunyamin Inan

Oui, l'URL de base a changé comme décrit et son fonctionnement maintenant merci
Aman Alam

1
@Bunyamin J'ai suivi la même méthode. La page d'accueil fonctionne mais la catégorie et la page du produit donnent une erreur 404. Toute suggestion? pouvez-vous m'aider à ce sujet.
Jaimin

1
@Jaimin, utilisez le code ci-dessus dans nginx.conf.sample pas dans nginx.conf. Cela résoudra votre problème.
umair ayub

2

Par la configuration Nginx, vous pouvez utiliser cet exemple de configuration:

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

et utilisez ce index.php comme exemple:

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

Afin de clarifier:

Dans ma configuration vhost nginx, vous trouverez ceci:

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

où le premier "/ votre / sous-dossier" peut être modifié pour ce que vous voulez comme URL de site Web. ex www.mywebsite.com/stack/magento -> / stack / magento

Ensuite, afin de définir le code du site Web qui sera chargé dans cette URL, vous devez créer le fichier index.php en écrivant le code du site Web ici:

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

J'espère que c'est maintenant assez clair, je dois passer du temps dans un projet pour y arriver, donc je sais que cela fonctionne et c'est plus proche de la façon dont nous le faisions sur M1.


Je ne comprends pas comment cela résoudra mon problème. J'ai spécifiquement demandé comment utiliser plusieurs sites Web. Suggérez-vous que ce code peut également être utilisé pour les sites Web?
Bunyamin Inan

Vous avez dit "Nous aimerions utiliser des sous-dossiers au lieu de sous-domaines". Je mettrai à jour ma réponse en clarifiant où se trouve chaque configuration de sous-dossier
Matias Hidalgo

Oui, je l'ai dit. J'ai également dit que j'aimerais utiliser plusieurs sites Web avec des sous-dossiers . Je ne comprends tout simplement pas ce que fait le code de magasin là- bas?
Bunyamin Inan

Ce n'était qu'une suggestion, si vos codes de magasin sont assez bons, vous n'avez pas besoin de gérer la configuration de nginx ... jetez un œil à mon explication
Matias Hidalgo

Vous dites donc que si mon code de magasin et le code de mon site Web correspondent, cela fonctionnera. J'ai également plusieurs magasins pour chaque site Web.
Bunyamin Inan

0

dans votre domain.conf dans "etc / nginx", vous devez créer une carte.

par exemple:

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

ou

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

Vous décrivez la voie du sous-domaine . Ce que je veux, c'est un sous-dossier . Je ne veux pas website1.magento-site.com, mais je veux magento-site.com/website1.
Bunyamin Inan

vous pouvez mapper votre sous-dossier de la même manière et ajouter une réécriture regex pour le sous-cheminmap $http_host$uri $MAGE_RUN_CODE
MagenX

J'ai essayé cette méthode, donne juste un 404.
themanwhoknowstheman

@MagenX Je vous ai vu suggérer cette méthode dans un autre post, mais vous n'entrez jamais dans les détails des directions exactes pour que cela fonctionne correctement. Se soucier de partager?
themanwhoknowstheman

0

Qu'en est-il d'une solution nginx pure avec cette double carte?

Tout d'abord, pour le site Web (merci @MagenX)

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

Une seconde pour la nouvelle demande uri

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

Et enfin, n'oubliez pas de définir la nouvelle REQUEST_URI calculée

location ~ \.php$ {
(...)
   include fastcgi_params;
   fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
   fastcgi_param REQUEST_URI $REQUEST_URI;
(...)
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.