Magento 2: Cách định cấu hình Nginx để sử dụng nhiều trang web với thư mục con


9

Chúng tôi muốn tạo nhiều trang web trong Magento 2. Có một bài viết về chủ đề này trong Tài liệu chính thức của Magento 2 , nhưng cách họ mô tả không phù hợp với trường hợp của chúng tôi.

Họ đang đề xuất sử dụng các tên miền phụ để xác định các trang web khác nhau, chẳng hạn như

  • trang web1 .magento-site.com
  • trang web2 .magento-site.com

Chúng tôi muốn sử dụng các thư mục con thay vì tên miền phụ . Để đưa ra một ví dụ,

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

Làm thế nào chúng ta có thể khắc phục vấn đề này trên máy chủ web Nginx?

Cấu hình của tôi

Tôi đang sử dụng Ubuntu 16.04. Tôi đã cài đặt Nginx và không thay đổi cấu hình lõi Nginx nào. Tôi đã tạo một tập tin magento-site.com.confbên trong /etc/nginx/sites-enabled/magento-site.com.conf.

/etc/nginx/sites-enables/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)

Tôi có nhiều cửa hàng cho mỗi trang web.


bạn chỉ cần thêm viết lại cho đường dẫn mới của mình
MagenX

Có rất nhiều khối viết lại và khối try_file trong nginx.conf rồi. Nếu bạn nhìn vào tươi cài đặt Magento 2, bạn sẽ thấy một nginx.conf với rất nhiều cấu hình.
Bunyamin Inan

@MagenX Bạn có thể giải thích thêm được không? Chính xác thì tôi nên viết lại ở đâu?
Bunyamin Inan

Câu trả lời:


13

Tôi đã thử nhiều cách để đạt được nhiệm vụ này. Tôi muốn cảm ơn @ matias-hidalgo vì những đóng góp của anh ấy, mặc dù lúc đầu tôi không hiểu câu trả lời của anh ấy :).

Đây là kịch bản. Chúng tôi có hai trang web khác nhau và mỗi trang web có hai chế độ xem cửa hàng khác nhau như sau:

Trang web 1

  • Trang web 1 (Thương mại điện tử)
  • Trang web 1 (Venda Assistida)

Trang web 2

  • Trang web 2 (Thương mại điện tử)
  • Trang web 2 (Venda Assistida)

Trong giải pháp của tôi, chúng tôi sẽ thay đổi một số cấu hình trong Magento Admin . Sau đó, chúng tôi sẽ tạo một số thư mục con , và cuối cùng chúng tôi sẽ sửa đổinginx.conf .

Trước hết, chúng ta cần thực hiện một số thay đổi cấu hình trong Quản trị viên Magento . Chuyển đến Stores-> Configuration-> General-> Web. Chúng tôi cần thay đổi URL cơ sở cho mỗi lượt xem cửa hàng.

Đối với cấu hình mặc định

Vui lòng cung cấp cấu hình sau cho cấu hình mặc định. nhập mô tả hình ảnh ở đây

Đối với Trang web 1 (Thương mại điện tử) và Trang web 1 (Venda Assistantida)

Vui lòng cung cấp cấu hình sau cho tất cả các lượt xem trang web của Cửa hàng 1 . nhập mô tả hình ảnh ở đây

Đối với Trang web 2 (Thương mại điện tử) và Trang web 2 (Venda Assistantida)

Vui lòng cung cấp cấu hình sau cho tất cả các lượt xem trang web của Cửa hàng 2 . nhập mô tả hình ảnh ở đây

Thứ hai, chúng ta cần tạo website1website2các thư mục trong thư mục /pub. Trong trận chung kết, bạn nên có các thư mục sau:

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

Sao chép pub/index.phptập tin vào các thư mục này. Sau đó, chúng tôi sẽ thực hiện một số thay đổi trong MAGENTO_ROOT/pub/website1/index.phpMAGENTO_ROOT/pub/website2/index.php.

Nội dung của MAGENTO_ROOT/pub/website1/index.php

Tôi chỉ thay đổi 3 dòng:

Dòng 1: require __DIR__ . '/../../app/bootstrap.php';

Dòng thứ 2: $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';

Dòng thứ 3: $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);

Đối với lần chạm cuối cùng, chúng tôi cần sửa đổi nginx.conftrong thư mục MAGENTO_ROOT của bạn. Vui lòng đặt cấu hình sau vào của bạn 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;
    }
}

Sau tất cả các cấu hình và sửa đổi này, bạn sẽ có thể sử dụng các trang web làm thư mục con. Tôi hy vọng nó sẽ giúp.


1
Vấn đề duy nhất tôi gặp phải với cấu hình này là nội dung tĩnh không hoạt động
Aman Alam

@AmanAlam Bạn có thay đổi url cơ sở cho nội dung tĩnh như được mô tả không? Chúng tôi đã thử nghiệm cấu hình này với 2 khách hàng khác nhau trong Magento 2.1.
Bunyamin Inan

Có thay đổi url cơ sở như được mô tả và hiện đang hoạt động, cảm ơn bạn
Aman Alam

1
@Bunyamin Mình làm theo phương pháp tương tự. Trang chủ đang hoạt động nhưng danh mục và trang sản phẩm đang đưa ra lỗi 404. Bất cứ đề nghị nào? bạn có thể giúp tôi trong đó
Jaimin

1
@Jaimin, sử dụng mã ở trên trong nginx.conf.sample không phải trong nginx.conf. Nó sẽ khắc phục vấn đề của bạn.
umair ayub

2

Theo cấu hình Nginx, bạn có thể sử dụng cấu hình ví dụ này:

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

và sử dụng index.php này làm ví dụ:

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

Để làm rõ:

Trong cấu hình vhost nginx của tôi, bạn sẽ tìm thấy điều này:

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

trong đó "/ your / thư mục con" đầu tiên có thể được thay đổi cho bất cứ điều gì bạn muốn như url trang web. ví dụ: www.mywebsite.com/stack/magento -> / stack / magento

Sau đó, để xác định mã trang web sẽ được tải vào url này, bạn phải tạo index.php viết mã trang web tại đây:

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

Tôi hy vọng điều này bây giờ đã đủ rõ ràng, tôi đã dành thời gian trong một dự án để thực hiện điều này để tôi biết nó hoạt động và nó gần giống như cách chúng ta thường làm trên M1.


Tôi không hiểu làm thế nào điều này sẽ giải quyết vấn đề của tôi. Tôi đặc biệt hỏi làm thế nào để sử dụng nhiều trang web. Bạn có gợi ý rằng mã này cũng có thể được sử dụng cho các trang web?
Bunyamin Inan

Bạn nói "Chúng tôi muốn sử dụng các thư mục con thay vì tên miền phụ." Tôi sẽ cập nhật câu trả lời của mình ngay bây giờ để làm rõ vị trí của từng cấu hình Thư mục con
Matias Hidalgo

Vâng, tôi đã nói rằng. Tôi cũng nói rằng tôi muốn sử dụng nhiều trang web với các thư mục phụ . Tôi chỉ không hiểu mã cửa hàng đang làm gì ở đó?
Bunyamin Inan

Đó chỉ là một gợi ý, nếu mã cửa hàng của bạn đủ tốt, bạn không cần phải xử lý cấu hình nginx ... hãy xem giải thích của tôi ngay bây giờ
Matias Hidalgo

Vì vậy, bạn đang nói rằng nếu mã cửa hàng và mã trang web của tôi phù hợp, điều này sẽ hoạt động. Tôi cũng có nhiều cửa hàng cho mỗi trang web.
Bunyamin Inan

0

trong domain.conf của bạn trong "etc / nginx", bạn cần tạo bản đồ.

ví dụ:

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

hoặc là

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

Bạn đang mô tả cách tên miền phụ . Những gì tôi muốn là cách thư mục con. Tôi không muốn website1.magento-site.com, nhưng tôi muốn magento-site.com/website1.
Bunyamin Inan

bạn có thể ánh xạ thư mục con của mình theo cùng một cách và thêm regex viết lại cho đường dẫn phụmap $http_host$uri $MAGE_RUN_CODE
MagenX

Tôi đã thử phương pháp này, chỉ đưa ra một 404.
themanwhoknowstheman

@MagenX Tôi đã thấy bạn đề xuất phương pháp này trên một bài đăng khác, tuy nhiên bạn không bao giờ đi sâu vào chi tiết về các hướng chính xác để làm cho nó hoạt động đúng. Quan tâm chia sẻ?
themanwhoknowstheman

0

Thế còn một giải pháp nginx thuần túy với bản đồ đôi này thì sao?

Đầu tiên, đối với trang web (cảm ơn @MagenX)

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

Một giây cho yêu cầu mới uri

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

Và cuối cùng, đừng quên thiết lập REQUEST_URI được tính toán mới

location ~ \.php$ {
(...)
   include fastcgi_params;
   fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
   fastcgi_param REQUEST_URI $REQUEST_URI;
(...)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.