【问题标题】:Apache two apps one domain share language /en - Magento & WordpressApache 两个应用程序一个域共享语言 /en - Magento 和 Wordpress
【发布时间】: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


    【解决方案1】:

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

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

    将商店代码添加到网址

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

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

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

    基本链接网址 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

    【讨论】:

    • 感谢您的想法,它确实有效并且会接受答案,唯一的缺点是我需要链接到 /products 的 /en/products 的物理文件夹,或者我错过了什么,我已经添加了我的 . htaccess
    • 不,您不需要该文件夹。 Base URL 是真实文件夹,base Link URL 可以是虚拟文件夹,试试看
    • 谢谢!,请参阅更新的答案,页面已翻译,例如 /de 菜单是德语但我得​​到 404,CMS 页面设置为所有商店视图/全球所有产品 @987654323 @如果我制作符号链接文件夹,请不要得到这个
    【解决方案2】:

    您想要达到的具体规格是什么?

    您是否有多个页面(如/products)和多种语言(如/en)?

    我在BXR.SU 做了类似的事情——我不喜欢我的后端 OpenGrok 处理 URL 的方式,所以,我会自动让我的 nginx 在 OpenGrok 之上修复 URL,无缝修复呈现的 URL给用户,而后端将继续使用旧的 URL(例如,对于大多数页面,我不喜欢使用 /xref/,并设置为使用 nginx 删除);这种方法似乎类似于您的规范,您希望在前端网络服务器上执行此操作而不对后端进行任何修改。

    该方法在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
        …
    }
    

    【讨论】:

    • 这并不能解决实际页面内容生成不正确链接的问题,这些链接很可能会被重定向,但这对 SEO 不利 @Aurélien 迄今为止给出了最佳答案
    • @JoelDavey 我很确定谷歌足够聪明,可以解决这个问题。对于 SEO,我认为来自其他网站的入站链接比内部链接更重要,而且这些仍然是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2015-05-13
    • 2011-03-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多