0

我有 3 个基于 Opencart 的子域。我需要在给定语言的每个域上强制执行什么

为此,应为每个子域严格定义 _GET['language']

en.handmade24.at -> 语言=en

ru.handmade24.at -> 语言=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]

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

4

3 回答 3

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]
于 2011-05-14T20:49:09.900 回答
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]
于 2011-05-14T21:50:40.680 回答
0

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

是的,您可以使用 .htaccess 来完成,但我不建议您这样做。在某个地方弄乱 .htaccess 可能会很痛苦。如果你这样做,在某些时候你很可能最终会做错事并破坏某些东西。它不是唯一的解决方案,这就是为什么我不会告诉你如何使用 .htaccess 来做到这一点。

我推荐的解决方案是我刚刚制作的一个巧妙的小解决方法/hack。我在寻找一种方法来处理子域,因为它是谷歌做多语言版本网站的首选(当然 TLD 除外)。

我想出了解决方案来否决默认的 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 etc etc else 语句。它的作用是检查是否设置了 $overwrite_language,如果设置了,那么它使用户“*选择*”的语言,因为它if在 if elseif 等 else 语句中命中,那么它不会运行任何其他人(然后会覆盖这个小工作区/黑客)。

-- 额外提示 --

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

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

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

- 整理起来 -

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

于 2014-02-25T21:02:04.527 回答