通过htaccess或......强制语言GET变量?

时间:2011-05-14 20:32:31

标签: .htaccess multilingual opencart

我有3个子域,它们基于Opencart。 我需要强制给出语言

的每个域

这样做_GET ['language']应该严格定义每个子域

en.handmade24.at - > language = en

ru.handmade24.at - > language = ru

www.handmade.24.at - >语言= DE

我被告知.htaccess是强制语言变量的好选择......

但我如何定义规则?有帮助吗?我在htaccess中是假的......

我的Htaccess看起来像这样

Options +FollowSymlinks

# Prevent Directoy listing 
Options -Indexes

# Prevent Direct Access to files
<FilesMatch "\.(tpl|ini)">
 Order deny,allow
 Deny from all
</FilesMatch>

# SEO URL Settings
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

或许你可以提供更好的解决方案?

3 个答案:

答案 0 :(得分:2)

RewriteCond %{HTTP_HOST} ^(www\.)?handmade24\.at
RewriteRule ^(.*)$       $1?language=de [QSA,L]

RewriteCond %{HTTP_HOST} ^(\w+)\.handmade24\.at
RewriteRule ^(.*)$       $1?language=%1 [QSA,L]

答案 1 :(得分:0)

以下是适合您的.htaccess:

Options +FollowSymlinks

# Prevent Directoy listing 
Options -Indexes

# Prevent Direct Access to files
<FilesMatch "\.(tpl|ini)">
 Order deny,allow
 Deny from all
</FilesMatch>

# SEO URL Settings
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?_route_=$1 [QSA,L,NE]

RewriteCond %{HTTP_HOST} ^(www\.)?handmade24\.at$ [NC]
RewriteRule ^(.*)$ $1?language=de [QSA,L]

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(.*)\.handmade24\.at$ [NC]
RewriteRule ^(.*)$ $1?language=%1 [QSA,L]

答案 2 :(得分:0)

首先,我已经为我解决了你的问题的项目取出了OpenCart系统,但这个技巧应该可以正常工作。

是的,你可以用.htaccess来做,但是我不想推荐这样做。与.htaccess混淆可能是某个地方的痛苦。如果你这样做,在某些时候你很可能最终做错了什么并且腐败了。它不是唯一的解决方案,这就是为什么我不会告诉你如何使用.htaccess来实现它。

我建议的解决方案是我刚刚制作的一个简洁的小工作/黑客。我在哪里寻找使用子域名的方法,因为这是谷歌做网站多语言版本的首选(当然除了顶级域名)。

我提出了推翻默认OpenCart语言选择/检测的解决方案。

首先在OpenCart安装的根目录中打开index.php。

用这个找到行:

if (isset($session->data['language']) && array_key_exists($session->data['language'], $languages) && $languages[$session->data['language']]['status']){
     $code = $session->data['language'];
} elseif (isset($request->cookie['language']) && array_key_exists($request->cookie['language'], $languages) && $languages[$request->cookie['language']]['status']) {
     $code = $request->cookie['language'];
} elseif ($detect) {
     $code = $detect;
} else {
     $code = $config->get('config_language');
}

然后用这个替换这些行:

$url_info = parse_url(str_replace('&amp;', '&', $config->get('config_url')));

foreach ($languages as $language)
{
    if ($language['code'] . '.' . $url_info['host'] == $request->server['HTTP_HOST'])
    {
        $overwrite_language = $language;
        break;
    }
}

if (isset($overwrite_language)) {
    $code = $overwrite_language['code'];
} elseif (isset($session->data['language']) && array_key_exists($session->data['language'], $languages) && $languages[$session->data['language']]['status']) {
    $code = $session->data['language'];
} elseif (isset($request->cookie['language']) && array_key_exists($request->cookie['language'], $languages) && $languages[$request->cookie['language']]['status']) {
    $code = $request->cookie['language'];
} elseif ($detect) {
    $code = $detect;
} else {
    $code = $config->get('config_language');
}

这是做什么的(注意:OpenCart之前几行从数据库中加载了可用的语言):

  1. 我们从数据库中获取URL(“设置表”,其中key ='config_url'),然后我们使用PHP函数parse_url,它将部分拆分(在其上执行print_r()以查看什么部分)。

  2. 然后,我们遍历可用的语言(在管理面板中启用的语言)。

  3. 在循环中,我们会检查$language['code'] . '.' . $url_info['host'] == $request->server['HTTP_HOST'](别名为$_SERVER['HTTP_HOST'])。我已经输入break所以如果已经找到了该域的匹配语言,它就会停止浪费资源。

  4. 我编辑了OpenCart上面提到的if elseif等else语句。它的作用是检查是否设置了$ overwrite_language,如果是,那么它会使用户“*选择*”的语言,因为它在if elseif等等其他语句中点击了if然后它不会运行任何其他的(然后会覆盖这个小工作-round / hack)。

  5. - 奖金提示 -

    如果您有权访问php.ini配置文件,或者您有权使用ini_set(),那么您可以在子域之间共享您的PHP会话

    ini_set('session.cookie_domain', '.yourdomain.TLD');
    

    (您可能需要销毁已创建的会话)。这可能是一个优势,但请注意它将覆盖默认的商店语言,但您可以修改刚刚更改的行下面的2 if。货币应该照常运作。

    - 完成 -

    应该是它,希望你会喜欢它并且可以使用它,即使很长一段时间你问这个问题,也许其他人可以使用它,就像我几个小时前一样。