如何使用Apache / mod_rewrite基于Accept-Language重定向

时间:2009-11-02 15:23:34

标签: php apache .htaccess mod-rewrite redirect

对于语言重定向,我们当前在Web根目录中创建包含index.php文件的文件夹,该文件检查HTTP_ACCEPT_LANGUAGE服务器变量。例如对于网址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");
?>

随着网站的增长,我们现在有了很多这样的文件夹。我试图通过将重定向移动到单个.htaccess文件来清理它:

RewriteEngine on

# Set the base path here
RewriteBase /path/to/site/

# The 'Accept-Language' header starts with 'en'
RewriteCond %{HTTP:Accept-Language} (^en) [NC]

# EN redirects
RewriteRule press(/?)$   press_en.php [L,R]

# DE redirects (for all languages not EN)
RewriteRule press(/?)$   press_de.php [L,R]

这个想法与php文件相同,但它不起作用。我在Firefox首选项中尝试了所有可能的语言设置/顺序,并检查了标题是否正确,但它始终提供press_de.php文件。

我做错了什么,还是有更好的方法? (不包括内容协商/多视图或任何需要重命名文件的内容,目前这不是一个选项)

2 个答案:

答案 0 :(得分:6)

我会将语言指示符放在网址路径的开头,如/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不是单个值,而是合格值列表。因此,可能不仅仅有一个值,第一个值并不总是首选值。

答案 1 :(得分:2)

在htaccess中

public class Address {

    private String streetAddress;
    private String region;
    private PhoneNumber phoneNumber;
}