语言重定向的状态码


HTTP Status code for language redirect

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

我有以下php代码通过HTTP头重定向到最重要的语言在接受语言浏览器头。

<?
$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状态

可能是300,301,302,303?为什么?

编辑

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

我发现了这个:

HTTP STATUS 300 Multiple Choices

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

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

的格式和功能

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

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

:

HTTP错误300 -多个选择

介绍

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

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

HTTP循环中的300个错误

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

从站点的IP名称(即站点URL)中获取IP地址没有"http://')"开头。此查找(将IP名称转换为IP地址)由dns (domain name server)提供。打开IP套接字连接到该IP地址。编写HTTP数据流通过那个插座。从Web接收HTTP数据流服务器响应。此数据流包含状态码,其值由HTTP协议决定。解析此数据流为状态码和其他有用的信息。这个错误发生在在上面的最后一步中,当客户端接收到HTTP状态码时,表示它识别为"300"。

修复300个错误- general

您应该做的第一件事是在Web浏览器中检查URL。如果您会看到某种Web页面提示您进行进一步操作操作/选择,那么你的URL就不够详细

修复300个CheckUpDown错误

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

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

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

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

同样,在谷歌搜索中心博客(2014年发布)的这篇文章中,它明确地说:

要根据用户的位置和语言设置自动为他们提供适当的HTML内容,您可以通过使用服务器端302重定向来实现。

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

https://www.rfc-editor.org/rfc/rfc9110.html#name-redirection-3xx

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

我宁愿建议在你的网站根url,你发出重定向(303 -见其他)到一个语言子页面(例如/en)。当您这样做时,使用Vary标头进行响应,该标头指定Accept-Language(以及任何其他相关标头,例如Cookie)。这样,任何中介体(代理、缓存)都能够缓存响应。我将特别而不是发出301,因为您仍然希望链接指向根url。在特定于语言的页面上,我将把rel="canonical"放到根url。

参见下列线程:

  • Google如何处理HTTP响应303?
  • 规范url和内容协商

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

我认为这个问题与你想要达到的目标更相关:

1:你的索引页应该是访问者的登陆页,你希望这个页面被搜索引擎索引。

优点:在实际登陆页面之前,为所有访问者提供一个可以容纳额外信息的入口页面。但是,它不会包含特定语言的内容。

缺点:你没有搜索引擎上所有语言的内容页。

2:实际翻译的页面应该是登陆页面,如果可能的话,你的访问者应该直接访问翻译后的页面。重定向页面只适用于在地址栏中输入主机名直接访问您的站点的访问者。

优点:每种语言都有多个"登陆页面",这有助于得分和点击。缺点:你没有一个通用的登陆页。

这两个选择有更多的利弊,但我现在想不出来。

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

阿菲克,谷歌只考虑,301,302和307(临时维护),我认为它认为所有其他的302(似乎最合乎逻辑)。就浏览器而言,我认为这并不重要。它可能会影响缓存,但我认为现在它们在缓存甚至3xx响应方面都相当激进。

HTTP 303,因为它有最合适的表述——参见Other (302-Moved Temporarily and 301 -Moved permanent)。实际上,在这种情况下,HTTP 303响应可以确保web用户的浏览器可以安全地刷新服务器响应,而不会导致初始HTTP POST请求被重新提交。