Принудительно использовать переменную языка GET через htaccess или ...? - PullRequest
0 голосов
/ 15 мая 2011

У меня есть 3 субдомена, которые основаны на Opencart. Что мне нужно форсировать на каждом домене данного языка

для этого _GET ['language'] должно быть строго определено для каждого субдомена

ru.handmade24.at -> language = en

ru.handmade24.at -> language = ru

www.handmade.24.at -> language = 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 ]

2 голосов
/ 15 мая 2011
RewriteCond %{HTTP_HOST} ^(www\.)?handmade24\.at
RewriteRule ^(.*)$       $1?language=de [QSA,L]

RewriteCond %{HTTP_HOST} ^(\w+)\.handmade24\.at
RewriteRule ^(.*)$       $1?language=%1 [QSA,L]
0 голосов
/ 26 февраля 2014

Прежде всего, я взял систему OpenCart для проекта, в котором я решил вашу проблему, но этот трюк должен работать просто отлично.

Да, вы можете сделать это с помощью .htaccess, однако я не хочу рекомендовать это делать. Возиться с .htaccess может быть боль в определенном месте. Если вы сделаете это, в какой-то момент вы, скорее всего, будете делать что-то не так и что-то портить. Это не единственное решение, и поэтому я не скажу вам, как это сделать с помощью .htaccess.

Решением, которое я бы порекомендовал, является аккуратный небольшой обходной путь / хак, который я только что сделал. Я искал способ сделать это с поддоменами, так как Google предпочитает делать многоязычные версии веб-сайтов (за исключением, конечно, TLD).

Я предложил решение, которое отменяет выбор / обнаружение языка OpenCart по умолчанию.

Прежде всего откройте index.php в корне вашей установки OpenCart.

Найдите строки с этим:

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. Я отредактировал оператор if elseif и т. Д. Else, который OpenCart сделал с вышеупомянутым. Что он делает, так это проверяет, установлен ли $ overwrite_language, если это так, то он делает язык, который пользователь "* выбрал *", так как он нажал if в операторе if elseif и т. Д. любой другой (который затем перезаписал бы эту небольшую работу / хак).

- Бонусный совет -

Если у вас есть доступ к файлу конфигурации php.ini или у вас есть разрешение на использование ini_set (), то вы можете разделить сеанс PHP между поддоменами

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

(вам может понадобиться уничтожить уже созданный сеанс). Это может быть преимуществом, однако обратите внимание, что он перезапишет язык магазина по умолчанию, но вы можете изменить 2 if ниже линий, которые вы только что изменили. Хотя валюты должны работать как обычно.

- Завершение -

Так и должно быть, надеюсь, вам понравится и вы сможете его использовать, даже если вы давно задавали этот вопрос, может быть, кто-то другой мог бы использовать его, как я мог несколько часов назад.

0 голосов
/ 15 мая 2011

Вот .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]
...