我们在根目录/物理子文件夹/ 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>
我想要达到的确切规格是
尝试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。
答案 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
…
}