gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:08:28 27 4
gpt4 key购买 nike

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

随着网站的发展,我们现在有很多这样的文件夹。我试图通过将重定向移动到单个 .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 首选项中尝试了所有可能的语言设置/命令,并检查了 header 是否正确,但它始终服务于 press_de.php 文件。

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

最佳答案

我会将语言指示器放在 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不是单个值,而是限定值列表。因此可能不止一个值,第一个值并不总是首选值。

关于php - 如何使用 Apache/mod_rewrite 基于 Accept-Language 进行重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1661915/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com