语言重定向的HTTP状态代码

时间:2011-11-30 12:13:49

标签: php http redirect seo

我想知道我应该用语言重定向发送哪个HTTP状态代码。

我有以下php代码通过HTTP标头重定向到Accept-Language浏览器标题中最重要的语言。

<?
$langs = array();

if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
    // break up string into pieces (languages and q factors)
    preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);

    if (count($lang_parse[1])) {
        // create a list like "en" => 0.8
        $langs = array_combine($lang_parse[1], $lang_parse[4]);

        // set default to 1 for any without q factor
        foreach ($langs as $lang => $val) {
            if ($val === '') $langs[$lang] = 1;
        }

        // sort list based on value 
        arsort($langs, SORT_NUMERIC);
    }
}

// look through sorted list and use first one that matches our languages
foreach ($langs as $lang => $val) {
    if (strpos($lang, 'ca')===0) {
    header("location: ca/");
    exit;
    } else if (strpos($lang, 'es')===0) {
    header("location: es/");
    exit;
    } 
  echo "$lang => $val<br>";
}
// show default site or prompt for language
header("location: en/");

?>

相关问题:HTTP status for functional redirect

也许300,301,302,303?为什么呢?

修改

谷歌最近发布了这个:  http://googlewebmastercentral.blogspot.com/2011/12/new-markup-for-multilingual-content.html

我发现了这个:

  

HTTP STATUS 300多项选择

     

请求的资源对应于一组中的任何一个   表示,每个都有自己的特定位置,代理人 -   正在提供驱动的谈判信息(第12节)   用户(或用户代理)可以选择首选表示和   将其请求重定向到该位置。

     

除非是HEAD请求,否则响应应该包含一个实体   包含资源特征和位置的列表   用户或用户代理可以选择最合适的一个。该   实体格式由内容中给出的媒体类型指定 -   输入标题字段。取决于

的格式和功能      

用户代理,可以选择最合适的选择   自动执行。但是,此规范没有定义   这种自动选择的任何标准。

     

如果服务器有首选的表示形式,它应该是   在Location中包含该表示的特定URI   领域;用户代理可以使用Location字段值进行自动   重定向。除非另有说明,否则此响应是可缓存的。

而且:

  

HTTP错误300 - 多项选择

     

简介

     

您的Web服务器认为客户端提供的URL(例如您的   Web浏览器或我们的CheckUpDown机器人)不够具体,而且   需要进一步选择多种选择。

     

这通常是URL表示高级别的情况   需要进行较低级别选择的分组,例如一个   用户必须在其中选择特定文件的目录   访问。

     

HTTP周期中的300个错误

     

任何客户端(例如您的Web浏览器或我们的CheckUpDown机器人)都可以使用   通过以下周期与Web服务器通信时:

     

从站点的IP名称(站点URL)获取IP地址   没有领先的'http://')。此查找(将IP名称转换为   IP地址)由域名服务器(DNS)提供。打开IP   套接字连接到该IP地址。编写HTTP数据流   通过那个插座。从Web接收HTTP数据流   服务器响应。此数据流包含状态代码   值由HTTP协议确定。解析此数据流   状态代码和其他有用信息。发生此错误   当客户端收到HTTP状态代码时,上面的最后一步   被认为是'300'。

     

修复300错误 - 一般

     

您应该做的第一件事是在Web浏览器中检查您的URL。如果   你会看到某种网页提示你进一步   动作/选择,那么你现在的URL不够详细   要处理的Web服务器。

     

修复300错误 - CheckUpDown

     

如果您在CheckUpDown帐户上永远不会看到此错误   给了我们一个顶级URL(如www.isp.com)来检查。如果是的话   对于顶级URL,很可能是Web服务器   软件编程或配置不正确。如果你有   给我们一个低级别的URL(例如www.isp.com/products/index.html)   检查,然后很可能即使通过a也无法访问此URL   网络浏览器。

     

您应该做的第一件事是在Web浏览器中检查您的URL。如果   你看到一个合理的网页,然后它可能表明我们的缺陷   软件。但是,如果您看到某种类型的网页提示您   进一步的行动/选择,那么你的网址不适合我们检查,   因为我们的系统不可能做出这种选择。

     

请在遇到时直接与我们联系(首选电子邮件)   300错误。只有我们能为您解决这些问题。如果有缺陷   我们的软件我们会修复它。但是,如果您的网址根本不适合我们   使用,您需要在CheckUpDown帐户上更改它(从...开始   点击“管理”按钮。

5 个答案:

答案 0 :(得分:5)

Google使用302 Found重定向到本地化页面。

我认为如果谷歌使用它是安全的......

但是,检查选择的响应应该做什么以及它的目的是什么并且它是否会影响缓存总是好的:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

答案 1 :(得分:4)

您可以在同一网址下提供每种语言,然后使用Accept-Language标题的内容协商,但我不建议这样做。

我宁愿建议在您的网站根网址上,向语言子网页(例如/en)发出重定向(303 - 请参阅其他)。执行此操作时,请使用Vary标头进行回复,该标头指定Accept-Language(以及任何其他相关标头,例如Cookie)。这样,任何中介(代理,缓存)都可以缓存响应。我特意发出301,因为您仍然希望链接指向根URL。在特定于语言的页面上,我会将rel="canonical"放到根URL。

另见这些主题:

答案 2 :(得分:1)

可能是HTTP 300 "Multiple Choices",因为它在技术上是相同的数据/文档,但有多种语言版本?

答案 3 :(得分:1)

我认为问题与你想要实现的目标更相关:

1:您的索引页应该是访问者的登录页面,并且您希望该页面被搜索引擎编入索引。

优点:您有一个可以在实际着陆页之前托管其他信息的访问者的入口页面。但是,它不会包含特定语言的内容。

缺点:您没有搜索引擎上所有语言的任何内容页面。

2:实际翻译的页面应该是着陆页,如果可能,您的访问者应该直接在翻译页面结束。重定向页面仅适用于通过在地址栏中输入主机名直接在您的网站上结束的访问者。

优点:每种语言都有多个“着陆页”,这有助于评分和点击。

缺点:您没有通用的目标网页。

这两种选择有更多的利弊,但我现在想不到它。

如果选项1:使用302,因为您仍然希望它成为搜索索引的一部分。 如果选项2:使用301,因为您不希望将该页面编入索引。或者,在语言选择页面上使用noindex。

Afaik,谷歌只考虑301,302和307(临时维护),我认为它认为其他一切都是302(似乎最合乎逻辑)。就浏览器而言,我认为无关紧要。它可能会影响缓存,但我认为现在他们在缓存甚至3xx响应方面非常积极。

答案 4 :(得分:0)

HTTP 303,因为它具有最合适的公式 - 请参阅其他(302暂时移动和301 - 永久移动)。 实际上,在这种情况下,HTTP 303会响应,以确保Web用户的浏览器可以安全地刷新服务器响应,而不会导致重新提交初始HTTP POST请求。