Php 如何使用Apache/mod_rewrite基于Accept语言重定向

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

对于语言重定向,我们当前在web根目录中创建文件夹,其中包含一个index.php文件,该文件检查
HTTP\u ACCEPT\u language
服务器变量。e、 g.对于url
www.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]