php 语言重定向的HTTP状态代码

yvt65v4c  于 2023-04-04  发布在  PHP
关注(0)|答案(5)|浏览(352)

我想知道我应该在语言重定向中发送哪个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 status for functional redirect
可能是300,301,302,303?为什么?

编辑

Google最近发布了这样一条消息:http://googlewebmastercentral.blogspot.com/2011/12/new-markup-for-multilingual-content.html
我发现了这个:
HTTP STATUS 300多个选项
所请求的资源对应于一组表示中的任何一个,每个表示具有其自己的特定位置,并且代理驱动的协商信息(部分12)被提供,使得用户(或用户代理)可以选择优选的表示并将其请求重定向到该位置。
除非它是一个HEAD请求,否则响应应该包括一个包含资源特性和位置列表的实体,用户或用户代理可以从中选择最合适的一个。实体格式由Content-Type头字段中给定的媒体类型指定。根据格式和功能
在用户代理中,最合适的选择可以自动执行。2然而,本规范并没有为这种自动选择定义任何标准。
如果服务器有一个首选的表示方式,它应该在Location字段中包含该表示方式的特定URI;用户代理可以使用位置字段值来自动重定向。2除非另有说明,否则此响应是可缓存的。
还有这个
HTTP错误300 -多个选择
项目介绍
您的Web服务器认为客户端(例如您的Web浏览器或我们的CheckUpDown机器人)提供的URL不够具体,需要从多个选项中进行进一步选择。
这通常是这样的情况,其中URL表示需要进行较低级别选择的高级分组,例如用户必须选择要访问的特定文件的目录。
HTTP周期中出现300个错误
任何客户端(例如您的Web浏览器或我们的CheckUpDown机器人)在与Web服务器通信时都会经历以下循环:
从站点的IP名称(不带前导'http://'的站点URL)获取IP地址。此查找(IP名称到IP地址的转换)由域名服务器(DNS)提供。打开到该IP地址的IP套接字连接。通过该套接字写入HTTP数据流。从Web服务器接收HTTP数据流作为响应。此数据流包含其值由HTTP协议确定的状态代码。分析此数据流以获取状态代码和其他有用信息。当客户端接收到它识别为'300'的HTTP状态代码时,在上面的最后一步中发生此错误。
修复300个错误-常规
你应该做的第一件事是在Web浏览器中检查你的URL。如果你看到某种网页提示你进一步的操作/选择,那么你的URL就不够详细,Web服务器无法处理。
修复300个错误- CheckUpDown
如果您提供给我们一个顶级URL(如www.example.com)进行检查,则您永远不会在您的CheckUpDown帐户上看到此错误www.isp.com。如果顶级URL出现此错误,则很可能是Web服务器软件的编程或配置不正确。如果您提供给我们一个低级URL(如www.isp.com/products/index.html)进行检查,则即使通过Web浏览器也可能无法访问此URL。
您应该做的第一件事是在Web浏览器中检查您的URL。如果您看到一个合理的网页,那么它可能表明我们的软件存在缺陷。但是,如果您看到某种网页提示您进一步的操作/选择,那么您的URL不适合我们检查,因为我们的系统不可能做出这种选择。
当您遇到300错误时,请直接联系我们(最好是电子邮件)。只有我们可以为您解决这些问题。如果我们的软件存在缺陷,我们将修复它。但是,如果您的URL根本不适合我们使用,您需要在您的CheckUpDown帐户上更改它(通过单击“管理”按钮开始)。

flvlnr44

flvlnr441#

Google使用302 Found重定向到本地化页面。
我认为如果Google使用它是安全的...
但是,检查选定的响应应该做什么,它的目的是什么,以及它是否影响缓存总是很好的:
https://www.rfc-editor.org/rfc/rfc9110.html#name-redirection-3xx

ifmq2ha2

ifmq2ha22#

你可以在同一个url下为每种语言提供服务,然后使用Accept-Language头的内容协商,但我不建议这样做。
我宁愿建议在你的网站根网址,你发出一个重定向(303 - See Other)到语言子页面(例如/en)。当您这样做时,使用指定Accept-LanguageVary标头进行响应(以及任何其他相关的头文件,例如Cookie)。(proxy,caches)将能够缓存响应。我会特别地 * 不 * 发出301,因为你仍然希望链接指向根URL。在语言特定的页面上,我会将rel="canonical"放置到根URL。
请参阅这些线程:

qco9c6ql

qco9c6ql3#

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

lyfkaqu1

lyfkaqu14#

我认为问题更多的是与你想要实现的目标有关:
1:您的索引页应该是您的访问者的着陆页,并且您希望该页面被搜索引擎索引。
优点:你有一个入口页面为您的所有访问者,可以主机实际的着陆页之前的附加信息.然而,它不会有特定语言的内容.
缺点:您在搜索引擎上没有针对所有语言的内容页面。
2:实际翻译的页面应该是着陆页,如果可能的话,您的访问者应该直接到达翻译的页面。重定向页面仅适用于通过在地址栏中输入主机名直接到达您网站的访问者。
优点:你有多个“着陆页”为每一个单独的语言,这有助于得分和点击。
缺点:你没有一个通用的着陆页。
这两个选择的利弊更多,但我现在想不出来。
如果选择1:使用一个302,因为你仍然希望它是搜索索引的一部分.如果选项2:使用一个301,因为你不想那个页面被索引。或者,在语言选择页面上使用一个noindex。
当然,谷歌只考虑,301,302和307(临时维护),我认为它认为其他一切都是302(似乎最合乎逻辑).至于浏览器去,我认为这并不重要.它可能会影响缓存,但我认为现在他们在缓存甚至3xx响应相当积极.

ff29svar

ff29svar5#

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

相关问题