Apache两个应用程序的一个域共享语言/中文-Magento和Wordpress

时间:2018-06-28 10:39:44

标签: php wordpress apache magento nginx

我们在根目录/物理子文件夹/ wp中有Wordpress,在/ products中有Magento。

我们希望使用子文件夹(例如domain.com/en)使网站成为多国语言

问题出现了,因为magento在网址之后附加了商店代码(语言),所以我们有了

domain.com/en (wordpress)
domain.com/products/en (magento)

自然,我们想要

domain.com/en
domain.com/en/products

现在很容易使用一些重写规则

RewriteRule ^(.*)/products/?(.*)$ /products/$1 [L]

但是仍然有一个问题,因为Magento将链接生成为/ products / en,因此可以像在

中那样开始修改这些链接的生成位置
\Magento\Store\Model\Store 

在_updatePathUseStoreView函数中,这似乎并不能处理所有链接

通常看来,这是一个糟糕的解决方案,另一个想法是使用Apache mod_substitute也似乎是不好的做法,而且开销很大。

另一种选择是将两个应用程序都放在根目录中,并具有一些查找逻辑以查看哪个URL属于哪个应用程序。

关于仅可以仅使用Nginx / Apache的安装的任何想法。在拥有唯一的url或正则表达式的内容上,这并不妥协。

这是我的.htaccess根目录

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{HTTP_HOST} ^(www.)?domain.com$
RewriteCond %{REQUEST_URI} !^/wp/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#RewriteCond %{REQUEST_URI} !^/(.*)/products
RewriteRule ^(.*)$ /wp/$1
RewriteCond %{HTTP_HOST} ^(www.)?domain.com$
RewriteRule ^(/)?$ wp/index.php [L]

RewriteCond %{REQUEST_URI} ^/(.*)/products
RewriteRule ^(.*)$ /products/index.php [L]

</IfModule>

我想要达到的确切规格是

  • Wordpress安装在/ wp中,Magento安装在/ products中
  • 两个站点上通过子文件夹使用的语言代码都显示为/ en / wordpress-page / en / products / magento-page

尝试1 使用基本链接URL在此处输入/ en / products并将基本URL保持为/ products

在转发第一个请求时,我必须像在根.htaccess中那样工作setEnv

RewriteCond %{REQUEST_URI} ^/(.*)/products
RewriteRule ^(.*)$ /products/index.php [E=MAGE_RUN_CODE:%1] [L]

然后在/products/.htaccess中

RewriteCond "%{ENV:REDIRECT_MAGE_RUN_CODE}"
RewriteRule .* - [E=MAGE_RUN_CODE:%{ENV:REDIRECT_MAGE_RUN_CODE}] [L]

我通过这样做检查代码是否通过了index.php

 echo getenv('MAGE_RUN_CODE');

在我的情况下,商店代码为“ en”等。但是语言切换器不起作用,它击中了Magento,但即使认为商店代码肯定通过也得到了404。

2 个答案:

答案 0 :(得分:1)

您只需要从后台进行一些配置即可。

系统=>配置=>常规=>网络=>网址选项

将商店代码添加到Urls

系统=>配置=>常规=>网络=>不安全

基本链接URL http://example.com/en/products/

系统=>配置=>常规=>网络=>安全

基本链接URL https://example.com/en/products/

然后,在htaccess中添加一条规则以设置正确的商店代码:

SetEnvIf Host .*example.com/en* MAGE_RUN_CODE=en_store SetEnvIf Host .*example.com/fr* MAGE_RUN_CODE=fr_store

答案 1 :(得分:0)

您要达到的确切规格是什么?

您是否有/products这样的多个页面,以及/en这样的多种语言?

我在BXR.SU做过类似的事情-我不喜欢后端的OpenGrok处理URL的方式,因此,我将自动让Nginx修复OpenGrok上的URL,从而无缝地修复URL。向用户提供的URL,而后端将继续使用旧的URL(例如,对于大多数页面,使用/xref/,我不喜欢,并设置为使用nginx删除);这种方法似乎与您的规范类似,您希望在前端Web服务器上执行此操作而不对后端做任何修改。

该方法在nginx redirect loop, remove index.php from url进行了简要描述,其思想是nginx具有两种重定向类型:内部重定向,其中$uri变量的内容被更改(对用户没有可见性) ,以及外部,其中向客户端提供了301 Moved(或类似的响应)响应(然后用户会看到浏览器使用新URL发出请求)。

例如,您可能想要具有以下内容:

location /en/ {
    # issue an external redirect, unless we're here from an internal one
    if ($request_uri ~ "^(/en)(/product)(.*)") {
        return 301 $2$1$3; # external redirect
    }
    proxy_pass …;
}
location /products/ {
    rewrite ^(/products/)(en/)(.*) $2$1$3 last; # internal redirect
    …
}