.htaccess - Magento网站下的Wordpress,包含多语言子目录

时间:2015-09-16 16:18:23

标签: wordpress .htaccess magento

TL;医生

我在www.example.com

上安装了Magento

我在www.example.com/wordpress

上安装了Wordpress

我需要以下网址同时提供相同的wordpress内容;

www.example.com/eu/wordpress
www.example.com/gb/wordpress

P.S。:我知道这有重复的内容问题,请忽略

问题是:最好的方法是什么?

完整故事

我有一个使用2 digit language code subdirectory technique的Magento多商店网站。

我在其自己的子目录中安装了一个Wordpress。

app
downloader
errors
eu/ - symlinks for the € Euro store
gb/ - symlinks for the £ UK store
includes
js
lib
media
shell
wordpress/ - The Wordpress install
var

我需要所有商店都提供Wordpress博客,以便用户使用他们的区域设置/货币留在商店中。

我尝试过什么

使用这些堆栈中的答案;

htaccess multi language site with sub directories, and default 301

Endless Redirect Loop by htaccess rules multi language

我做过尝试但不幸的是我对.htaccess和vhosts问题感到很糟糕

通过vhosts文件

<VirtualHost *:80>
    ServerName www.example.com/eu/wordpress/
    ServerAlias www.example.com/wordpress/
    DocumentRoot /var/www/vhosts/www.example.com/public/wordpress
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com/gb/wordpress/
    ServerAlias www.example.com/wordpress/
    DocumentRoot /var/www/vhosts/www.example.com/public/wordpress
</VirtualHost>

通过Wordpress htaccess

RewriteCond %{REQUEST_URI} !^/(eu|gb )/wordpress(/|$) [NC]
RewriteRule ^(.*)$ wordpress/$1 [R=301,L]

通过Magento .htaccess

RewriteCond %{REQUEST_URI} ^/eu/wordpress/(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^/gb/wordpress/(.*)$ [OR]
RewriteRule ^/wordpress/.*$ - [L]

2 个答案:

答案 0 :(得分:2)

首先,你不需要vhosts用于wordpress,每个域和/或子域只需要一个vhost。你的vhost看起来应该是这样的(我假设你的magento商店已经有类似的vhost):

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/vhosts/www.example.com/public

    <Directory "/var/www/vhosts/www.example.com/public">
        # allow .htaccess files to override all directives
        AllowOverride All
    </Directory>
</VirtualHost>

现在,您只需要修改magento的 .htaccess (/ var / www / vhosts / www.example.com / public / .htaccess),并添加以下规则:

<IfModule mod_rewrite.c>
    RewriteEngine on

    # rewrite rule to redirect
    # eu/wordpress  -> /wordpress/
    # eu/wordpress/ -> /wordpress/
    # gb/wordpress  -> /wordpress/
    # gb/wordpress/ -> /wordpress/
    RewriteRule ^(eu|gb)/wordpress/?$ /wordpress/ [R=301,NC,L]

    # ... continue here with magento's rewrite rules ...
</IfModule>

答案 1 :(得分:0)

我们正在制作中,希望这个答案在某些方面可能对某些人有帮助。

我们这样做的方法是添加一个RUN_CODE环境变量,该变量在自定义Wordpress过滤器中用于获取所有工作的URL。我已经使用了&#39; eu&#39;我的问题的例子来说明如下。请注意,我们必须为Apache和Nginx执行此操作,因此我已为两者添加了.htaccess和服务器块。

APACHE - .htaccess

eu country stub子目录中,将其添加到.htaccess文件中(so eu / .htaccess)

RewriteCond %{REQUEST_URI} ^/eu/wordpress$
RewriteRule ^(.*)$ /eu/wordpress/ [R=301]

RewriteCond %{REQUEST_URI} ^/eu/wordpress(.*)$
RewriteRule ^(.*)$ /wordpress/index.php/$1 [L,E=RUN_CODE:eu]

NGINX - 服务器阻止

location ~* /eu/wordpress(.*) {
        if (!-f $request_filename) {
                set $code 'eu';
                rewrite ^(.*)$ /wordpress/index.php?$1 last;
                break;
        }
}

在Wordpress根目录index.php中,这是在文件顶部添加的

$pos = strpos($_SERVER['REQUEST_URI'], '/wordpress');
if ($pos !== 0) {
    $_SERVER['REQUEST_URI'] = substr($_SERVER['REQUEST_URI'], $pos);
}

Wordpress主题functions.php

add_filter('post_link', 'link_mcnab');
add_filter('page_link', 'link_mcnab');
add_filter('bloginfo_url', 'link_mcnab');
function link_mcnab($link)
{
    if (isset($_SERVER['REDIRECT_RUN_CODE']) && $_SERVER['REDIRECT_RUN_CODE']) {
        $homeUrl = home_url();
        $domain = substr($homeUrl, 0, strrpos($homeUrl, '/'));
        $link = str_replace($domain, $domain . '/' . $_SERVER['REDIRECT_RUN_CODE'], $link);
    }

    return $link;
}