Magento 2:如何将Nginx配置为通过子文件夹使用多个网站


9

我们想在Magento 2中创建多个网站。Magento2 官方文档中有关于此主题的文章,但是它们描述的方式不适合我们的情况。

他们建议使用子域来确定不同的网站,例如

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

我们想使用子文件夹而不是子域。举个例子

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

我们如何在Nginx Web服务器上解决此问题?

我的配置

我正在使用Ubuntu 16.04。我已经安装了Nginx,并且没有更改任何Nginx核心配置。我在magento-site.com.conf里面创建了一个文件/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;
}

编辑1:(2017-10-23)

每个网站都有多家商店。


您只需要为新路径添加重写
MagenX

nginx.conf中已经有很多重写和try_file块。如果您看一下全新的 Magento 2安装,您将看到具有许多配置的nginx.conf。
Bunyamin Inan

@MagenX您能解释更多吗?我到底应该把重写放在哪里?
Bunyamin Inan

Answers:


13

我尝试了多种方法来完成此任务。我要感谢@ matias-hidalgo的贡献,尽管我一开始不理解他的回答:)。

这是场景。我们有两个不同的网站,每个网站都有两个不同的商店视图,如下所示:

网站1

  • 网站1(电子商务)
  • 网站1(Venda Assistida)

网站2

  • 网站2(电子商务)
  • 网站2(Venda Assistida)

在我的解决方案中,我们将更改Magento Admin中的某些配置。然后,我们将创建一些子文件夹,最后,我们将修改nginx.conf

首先,我们需要在Magento Admin中进行一些配置更改。转到Stores-> Configuration-> General->Web。我们需要为每个商店视图更改基本URL

对于默认配置

请提供以下配置作为默认配置。 在此处输入图片说明

对于网站1(电子商务)和网站1(Venda Assistida)

请为所有“ 网站1”商店视图提供以下配置。 在此处输入图片说明

对于网站2(电子商务)和网站2(Venda Assistida)

请为所有Website 2商店视图提供以下配置。 在此处输入图片说明

其次,我们需要在目录中创建website1website2文件夹/pub。最后,您应该具有以下文件夹:

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

pub/index.php文件复制到这些目录中。然后,我们将在MAGENTO_ROOT/pub/website1/index.php和中进行一些更改MAGENTO_ROOT/pub/website2/index.php

内容 MAGENTO_ROOT/pub/website1/index.php

我只更改了3行:

第一行: require __DIR__ . '/../../app/bootstrap.php';

第二行: $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';

第三行: $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);

最后,我们需要nginx.conf在您的MAGENTO_ROOT目录中进行修改。请在您的中输入以下配置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;
    }
}

完成所有这些配置和修改后,您将可以将网站用作子文件夹。希望对您有所帮助。


1
只有我与这个CONFIGRATION面临的问题是不工作的静态内容
祖阿曼阿拉姆

@AmanAlam是否按照说明更改了静态内容的基本URL?我们已经在Magento 2.1中使用2个不同的客户端测试了此配置。
Bunyamin Inan

是的,已经按照说明更改了基本网址,现在可以正常工作了
Aman Alam

1
@Bunyamin我遵循相同的方法。主页正在运行,但类别和产品页面显示404错误。有什么建议吗?你能帮我吗
Jaimin '18年

1
@Jaimin,请在nginx.conf.sample中使用以上代码,而不要在nginx.conf中使用。它将解决您的问题。
umair ayub

2

通过Nginx配置,您可以使用以下示例配置:

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

并以以下index.php为例:

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

为了澄清:

在我的vhost nginx配置中,您会发现以下内容:

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

您可以根据需要将第一个“ /您的/子文件夹”更改为网站网址。例如www.mywebsite.com/stack/magento-> / stack / magento

然后,为了定义将要加载到该URL中的网站代码,您必须创建index.php在此处编写网站代码:

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

我希望现在已经足够清楚了,我必须花时间在一个项目上以完成此工作,以便我知道它的工作原理,并且它与我们以前在M1上的实现方式更加接近。


我不知道这将如何解决我的问题。我专门问过如何使用多个网站。您是否建议将此代码也可用于网站?
Bunyamin Inan

您说:“我们想使用子文件夹而不是子域。” 我现在将更新我的答案,以澄清每个子文件夹配置在哪里
Matias Hidalgo

是的,我这么说。我还说过,我想使用多个带有子文件夹的网站。我只是不明白那里的商店代码在做什么?
Bunyamin Inan

这只是一个建议,如果您的商店代码足够好,则无需处理nginx配置...现在看看我的解释
Matias Hidalgo

因此,您说的是,如果我的商店代码和网站代码匹配,则可以使用。每个网站我也有多家商店。
Bunyamin Inan

0

在“ etc / nginx”中的domain.conf中,您需要创建一个映射。

例如:

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

要么

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

您正在描述子域方式。我想要的是子文件夹方式。我不要website1.magento-site.com,但我要magento-site.com/website1
Bunyamin Inan

您可以以相同的方式映射子文件夹,并为子路径添加正则表达式重写map $http_host$uri $MAGE_RUN_CODE
MagenX

我尝试了这种方法,只给出了
404。– themanwhoknowstheman

@MagenX我已经看到您在另一篇文章中建议使用此方法,但是您永远不会详细说明使此方法正常工作的确切方向。想要分享?
–themanwhoknowstheman

0

使用此双重映射的纯nginx解决方案怎么样?

首先,对于网站(感谢@MagenX)

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

新请求uri的一秒钟

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

最后,不要忘记设置新的计算得出的REQUEST_URI

location ~ \.php$ {
(...)
   include fastcgi_params;
   fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
   fastcgi_param REQUEST_URI $REQUEST_URI;
(...)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.