【发布时间】:2018-12-07 09:56:09
【问题描述】:
我们在根目录 / 在物理子文件夹 /wp 中有 Wordpress,在 /products 中有 Magento。
我们希望使用子文件夹(例如 domain.com/en)使网站支持多语言
问题出现是因为 magento 在 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。
【问题讨论】:
标签: php wordpress apache magento nginx