【问题标题】:Magento stores in subfolders using nginx proxy_passMagento 使用 nginx proxy_pass 存储在子文件夹中
【发布时间】:2013-04-30 15:28:11
【问题描述】:

我目前正在尝试使用单独的商店视图设置 Magento 安装以进行本地化。但是,我不确定我目前在 Nginx 中实现 URL 处理的方式是最干净的解决方案。

网址结构为:

http://www.example.com/        (US store)
http://www.example.com/nl/     (Dutch store)
http://www.example.com/nl/en   (Dutch store, English language)

等等。无论 URL 结构如何(即 http://www.example.com/nl/en/index.phphttp://www.example.com/index.php 都对应于 /var/www/magento/index.php),每个商店视图的 PHP 代码都将从 /var/www/magento/ 提供。

我们目前正在寻找 16 家独立的 Magento 商店,最终可能会扩大到 30 家以上。 Magento/PHP 性能是许多商店都关心的问题,但我现在更担心 Nginx。

当前端口 80 处理所有传入连接,并根据本地化代码使用 proxy_pass 将它们重定向到 localhost 上的单独 Nginx 服务器。然后,此服务器设置 MAGE_RUN_CODE 变量以将商店代码指定为 Magento:

server {
    listen 80 default;
    server_name www.example.com;
    root /var/www/magento;

    location /nl {
        rewrite           ^/nl/(.*) /$1 break;                               
        proxy_pass        http://localhost:82;                                  
        proxy_set_header  X-Real-IP  $remote_addr;
    }

    ... ## Similar location blocks for other country codes

    location ^~ /media/ {                                                    
        expires 30d; ## Assume all files are cachable                       
    }

    ... ## Similar location blocks for other static content  

    location / {                                                                
        proxy_pass        http://localhost:81;                                  
        proxy_set_header  X-Real-IP  $remote_addr;                              
    }
}

server {
    listen localhost:81;
    server_name www.example.com;
    root /var/www/magento;

    ...

    # Handle PHP files
    location ~ .php$ {

        ... ## Uses standard Magento configuration, except for:

        fastcgi_param  MAGE_RUN_CODE en_us;
        fastcgi_param  MAGE_RUN_TYPE store;

        ...
    }

... ## Similar configuration blocks for other stores

}

listen 80 块中的重写会从 URL 中去除商店代码,从而为 Magento 提供正确的 REQUEST_URI。商店代码是根据处理请求的端口设置的(它本身由 URL 中的商店代码决定)。然后当 Magento 执行 index.php 重定向魔术时,商店代码被重写为 URL(例如,荷兰商店的基本 URL 被指定为 http://www.example.com/nl/,因此对 /product/ 的请求被重写为 http://www.example.com/nl/product/,如果荷兰商店代码已设置)。

一切运行良好。导航到子文件夹 URL 时,商店代码设置正确,页面上的所有链接都没有损坏,并且静态文件是从域的根目录提供的。

不过,这个设置让我很痒。我知道 proxy_pass 的开销并不大,并且从端口 80 提供静态文件时,每个页面加载应该只有一个额外的内部连接,但我担心我错过了一些明显的东西(或者更糟糕的是,一些非很明显)这使得这是一个坏主意。谁能告诉我为什么我不应该以这种方式路由请求,或者提出改进性能的建议?

另一种选择(建议在another Stack Overflow thread 中)是在/var/www/magento 中设置符号链接嵌套(例如ln -s /var/www/magento/ /var/www/magento/nl/en/)。由于涉及的商店数量众多,这可能会变得一团糟。 (我也无法让它在合理的时间内工作!)

【问题讨论】:

  • 我已经尝试建立这种多商店结构一个多星期了,您是我发现的第一个使用相同用例的人。我很惊讶这没有得到更好的记录。

标签: magento nginx reverse-proxy subdirectory


【解决方案1】:

为什么要分离成虚拟主机?只需根据 URL 设置一个变量,然后将 MAGE_RUN_CODE 设置为该变量的值。

【讨论】:

  • 部分问题是 Magento 需要重写以从基本 URL 中删除商店代码,否则无论商店代码如何,它都会查找 /var/www/magento/nl/en/index.php。 (同样,符号链接可以在这里工作,但这似乎是一个彻底的黑客攻击。)也许正确设置 REQUEST_URI 参数也可以工作。或者,我可以在 every 位置块中复制重写,但配置可能很快就会失控。
  • @bclune 我回家后会尝试重现此内容。你能列出你的系统-配置-网络吗?默认视图 base_URL 和设置“redirect to base URL”的值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
相关资源
最近更新 更多