正在将子域重定向到另一种语言的get查询字符串中.htaccess



如果有人正在调用我的域en.sparkm4.de,但应该得到www.sparkm4.de/index.php,我仍在努力弄清楚如何重定向用户?lang=en我想保留子域,但我希望.htaccess的脚本正是在调用php脚本,该脚本可以翻译子域内的所有内容。到目前为止,我有3个子域,比如英语的en.sparkm4.de,法语的fr.sparkm4n.de,西班牙语的es.sparkm4n.d,最高级的域名www基本上是德语。到目前为止,我尝试过这个:

RewriteEngine on
RewriteCond %{QUERY_STRING} !^en=
RewriteCond %{HTTP_HOST} ^(?!www.)(.+).sparkm4n.de$
RewriteRule ^(/?)$ $1?lang=%1en

我不太确定它是否做了正确的事情,因为我对.htaccess regex完全陌生。有什么更好的解决方案可以将3个子域包含在一个.htaccess中。htaccess正在从顶级获取内容,并将查询放入子域?子文件夹中没有内容,但它应该重定向到具有所有内容和脚本的顶层域

这样做:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} !(?:^|&)lang= [NC]
RewriteCond %{HTTP_HOST} ^(?!www.)(.+).sparkm4n.de$ [NC]
RewriteRule ^ %{REQUEST_URI}?lang=%1 [L,QSA]

请注意,如果缺少lang参数,这将用一个额外的参数重写每个页面这不会在浏览器URL中显示lang参数,因为我们没有使用R标志进行完全(外部)重定向。

我使用建议的$_SERVER['HTTP_HOST'];解决了这个问题我直接在语言脚本文件中实现了这个:

<?php
session_start();
header('Cache-control: private');
list($subdomain,$host) = explode('.', $_SERVER["HTTP_HOST"]);
if($subdomain == 'en'){
$lang = 'en';
} else if($subdomain == 'es'){
$lang = 'es';
} elseif($subdomain == 'fr'){
$lang = 'fr';
} else{
$lang = 'de';
}
if(isSet($lang)){
$_SESSION['lang'] = $lang;
setcookie('lang', $lang, time() + (3600 * 24 * 30));
}
else if(isSet($_SESSION['lang'])){
$lang = $_SESSION['lang'];
}
else if(isSet($_COOKIE['lang'])){
$lang = $_COOKIE['lang'];
}
else{
$lang = 'de';
}
switch ($lang) {
case 'en':
$lang_file = 'en.php';
break; 
case 'fr':
$lang_file = 'fr.php';
break; 
case 'es':
$lang_file = 'es.php';
break; 
default:
$lang_file = 'de.php';
}

最新更新