我有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]
或许你可以提供更好的解决方案?
答案 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('&', '&', $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之前几行从数据库中加载了可用的语言):
我们从数据库中获取URL(“设置表”,其中key ='config_url'),然后我们使用PHP函数parse_url,它将部分拆分(在其上执行print_r()以查看什么部分)。
然后,我们遍历可用的语言(在管理面板中启用的语言)。
在循环中,我们会检查$language['code'] . '.' . $url_info['host']
== $request->server['HTTP_HOST']
(别名为$_SERVER['HTTP_HOST']
)。我已经输入break
所以如果已经找到了该域的匹配语言,它就会停止浪费资源。
我编辑了OpenCart上面提到的if elseif等else语句。它的作用是检查是否设置了$ overwrite_language,如果是,那么它会使用户“*选择*”的语言,因为它在if elseif等等其他语句中点击了if
然后它不会运行任何其他的(然后会覆盖这个小工作-round / hack)。
- 奖金提示 -
如果您有权访问php.ini配置文件,或者您有权使用ini_set(),那么您可以在子域之间共享您的PHP会话
ini_set('session.cookie_domain', '.yourdomain.TLD');
(您可能需要销毁已创建的会话)。这可能是一个优势,但请注意它将覆盖默认的商店语言,但您可以修改刚刚更改的行下面的2 if
。货币应该照常运作。
- 完成 -
应该是它,希望你会喜欢它并且可以使用它,即使很长一段时间你问这个问题,也许其他人可以使用它,就像我几个小时前一样。