- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个多语言
页面,我想检测客户端浏览器的语言,然后制作一个 301 主页或其他东西。但我不确定哪种方式更适合 seo。不知道web spider
喜欢哪一个?还是其他方式?
<?php
$LG=$_SERVER['HTTP_ACCEPT_LANGUAGE'];
if (preg_match('/^[zZ][hH]/', $LG)) {
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com/cn/");
exit();} //jump to chinese version
else {
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com/en/");
exit();} //jump to english version
?>
或
<?php
$LG=$_SERVER['HTTP_ACCEPT_LANGUAGE'];
if (preg_match('/^[zZ][hH]/', $LG)) {
include ("http://mydomain.com/cn/");
} //include chinese version
else {
header("HTTP/1.1 301 Moved Permanently");
include ("http://mydomain.com/en/");
} //include english version
?>
或者其他方式?谢谢。
最佳答案
正如您在问题中已经假设的那样,您需要解析 Accept-Language
HTTP/1.1 header ,在 $_SERVER['HTTP_ACCEPT_LANGUAGE']
中的 PHP 中可用。首先需要将其解析为您可以在 PHP 中更好地处理的结构,例如数组:
/**
* Convert Accept Language to sorted PHP array
*
* Related HTTP Specs:
* <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4>
* <http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.9>
*
* @param string $accept header value
* @return array ([language-range] => qvalue, ...)
*/
function http_accept_language_array($accept = NULL)
{
if (!$accept && isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
$accept = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept = (string) $accept;
$pattern = '/([a-z]{1,8}(-[a-z]{1,8})?)(;q=([01](?:\.[0-9]{0,3})?))?(?=$|,[ ]*)/i';
preg_match_all($pattern, $accept, $matches);
$array = array();
if (count($matches[1]))
{
list(, $ranges,,, $qvals) = $matches;
# normalize ranges
foreach ($ranges as &$range)
$range = strtolower($range);
unset ($range);
# set default qvalue 1
foreach ($qvals as &$qval)
if ('' === $qval) $qval = '1';
unset ($qval);
$array = array_combine($ranges, $qvals);
arsort($array, SORT_NUMERIC);
}
return $array;
}
da, en-gb;q=0.8, en;q=0.7
将返回:
array(3) {
["da"] => string(1) "1"
["en-gb"] => string(3) "0.8"
["en"] => string(3) "0.7"
}
然后您需要解析这个排序数组以找到您的第一个匹配项,使用 en
默认值设置您的首选项:
$lang = 'en';
foreach (http_accept_language_array() as $range => $qvalue)
{
if (preg_match('/^zh[$-]/', $range))
{
$lang = 'cn';
break;
}
}
最后,您可以根据 $lang
(或 include 或其他)进行重定向:
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com/$lang/");
如果您正在寻找一个现成的库来处理这个问题,一个现有的解决方案是 Symfony's HttpFoundation\Request
或者在 PEAR 中有 HTTP::negotiateLanguage
.
PHP intl 扩展有另一个相关的低级函数,但它不提供数组,而是提供单个值:locale_accept_from_http
更多 HTTP 相关信息的另一个通用资源是 Advanced handling of HTTP requests in PHP .
关于php - 哪个是检测浏览器语言并将301重定向到主页的最友好的seo方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8091296/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!