我会将语言指示器放在URL路径的开头,如/ en / …或/ de / ….然后,您可以使用单个脚本来检查首选语言,并通过预先添加语言指示符来重定向请求:
// negotiate-language.php
$availableLanguages = array('en', 'de');
if (!preg_match('~^/[a-z]{2}/~', $_SERVER['REQUEST_URI'])) {
$preferedLanguage = someFunctionToDeterminThePreferedLanguage();
if (in_array($preferedLanguage, $availableLanguages)) {
header('Location: http://example.com/'.$preferedLanguage.$_SERVER['REQUEST_URI']);
} else {
// language negotiation failed!
header($_SERVER['SERVER_PROTOCOL'].' 300 Multiple Choices', true, 300);
// send a document with a list of the available language representations of REQUEST_URI
}
exit;
}
和相应的规则:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)$negotiate-language.php [L]
RewriteRule ^([a-z]{2})/([^/]+)$$2_$1.php [L]
请注意,您需要一个正确的someFunctionToDeterminThePreferedLanguage函数,因为Accept-Language header field不是单个值,而是一个限定值列表.因此,可能不仅仅有一个值,第一个值并不总是首选值.