Apache如何实现两个应用程序共享一个域名的语言(/en)- Magento和WordPress。

5
我们在根目录/物理子文件夹/wp中使用了WordPress,并在/products中使用Magento。
我们希望使用子文件夹(例如domain.com/en)使网站支持多语言。
问题在于Magento会在URL后附加存储代码(语言),因此我们有以下URL结构:
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个回答

1
你只需要从后台进行一些配置。
系统 => 配置 => 通用 => Web => URL选项
在URL中添加商店代码 No
系统 => 配置 => 通用 => Web => 不安全
基本链接URL http://example.com/en/products/ 系统 => 配置 => 通用 => Web => 安全
基本链接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

谢谢你的建议,确实有效,我会接受这个答案。唯一的缺点是我需要为/en/products创建物理文件夹,以链接到/products,或者我有什么遗漏吗?我已经添加了我的.htaccess文件。 - Joel Davey
不,你不需要有这个文件夹。基本URL是一个真实的文件夹,基本链接URL可以是虚拟文件夹,试一下吧。 - Aurélien
谢谢!请查看更新的答案。例如,页面已翻译为/de,但菜单是德语的,但我却得到了404错误。CMS页面设置为所有商店视图/全局,所有产品也是如此。https://imgur.com/a/jkzIZ9x 如果我创建符号链接文件夹,则不会出现此问题。 - Joel Davey

0

您想要实现的确切规格是什么?

您是否有多个页面,例如/products和多种语言例如/en

我之前在 BXR.SU 做过类似的事情 - 我不喜欢后端 OpenGrok 处理 URL 的方式,因此我会自动让我的 Nginx 在 OpenGrok 之上修复 URL ,无缝地修复呈现给用户的URL,而后端仍将继续使用旧的URL(例如对于大多数页面使用/xref/,这是我不喜欢的,并且可以通过 nginx 删除); 这种方法与您的规格类似,您希望在前端 Web 服务器上执行此操作,而不对后端进行任何修改。

该方法在nginx重定向循环,从URL中删除index.php中简要描述,其思想是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
    …
}

这并没有解决实际页面内容生成不正确链接的问题,它们可能会被重定向,但对于SEO来说并不好。@Aurélien目前为止给出了最好的答案。 - Joel Davey
@JoelDavey 我非常确信 Google 足够聪明,可以找出其中的问题。对于SEO而言,我想其他网站的入站链接比内部链接更重要,并且那些链接仍然是正确的。 - cnst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接