Php 如何使用Apache/mod_rewrite基于Accept语言重定向
对于语言重定向,我们当前在web根目录中创建文件夹,其中包含一个index.php文件,该文件检查Php 如何使用Apache/mod_rewrite基于Accept语言重定向,php,apache,.htaccess,mod-rewrite,redirect,Php,Apache,.htaccess,Mod Rewrite,Redirect,对于语言重定向,我们当前在web根目录中创建文件夹,其中包含一个index.php文件,该文件检查HTTP\u ACCEPT\u language服务器变量。e、 g.对于urlwww.example.com/press/ 在/var/www/site/press/index.php中: <?php if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "en") header("location: ../press_en.php"); else
HTTP\u ACCEPT\u language
服务器变量。e、 g.对于urlwww.example.com/press/
在/var/www/site/press/index.php
中:
<?php
if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "en")
header("location: ../press_en.php");
else
header("location: ../press_de.php");
?>
这个想法与php文件相同,但不起作用。我尝试了Firefox首选项中所有可能的语言设置/顺序,并检查了标题是否正确,但它始终提供press_de.php
文件
我做错了什么,还是有更好的方法?(不包括内容协商/多视图或任何需要重命名文件的内容,这目前不是一个选项)。我会将语言指示器放在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]
请注意,您需要一个适当的somefunction来确定引用语言函数,因为它不是单个值,而是限定值的列表。因此可能不止一个值,第一个值并不总是首选值。在htaccess中
RewriteEngine on
RewriteCond %{HTTP:Accept-Language} (en) [NC]
RewriteRule .* server.com/press_en.php [L]
RewriteCond %{HTTP:Accept-Language} (de) [NC]
RewriteRule .* server.com/press_de.php [L]
RewriteEngine on
RewriteCond %{HTTP:Accept-Language} (en) [NC]
RewriteRule .* server.com/press_en.php [L]
RewriteCond %{HTTP:Accept-Language} (de) [NC]
RewriteRule .* server.com/press_de.php [L]