哪些浏览器支持 307/308 重定向,它们是如何处理的?

问题描述 投票:0回答:3

307 和 308 重定向 (https://www.rfc-editor.org/rfc/rfc7538) 被大多数现代浏览器接受。

然而,经过大量谷歌搜索后,我无法找到支持 307/308 重定向的浏览器版本列表。许多帖子如下:HTTP 状态代码 308 有什么问题? 只需询问是否支持 308 重定向。

我知道一些旧的浏览器不支持 307/308 重定向(https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/308),但不清楚是哪个浏览器版本没有。

所以我的问题是,哪个浏览器版本支持307/308重定向?

还有旧浏览器如何处理这个状态码?他们只是失败了吗?

http redirect cross-browser http-status-code-404 http-status-code-308
3个回答
9
投票

截至 2018 年 2 月 20 日,由于在 Windows 7 和 8.1 上缺乏对 IE 11 的支持,甚至不是所有现代/支持的浏览器都支持它:

  • 失败 - Windows 7 上的 IE 11(版本 11.0.9600.18893)。在站点中使用 308 时,浏览器似乎挂起并且不加载任何内容。 [编辑] 截至 2018 年 7 月 25 日,这仍然失败(版本 11.0.9600.19035) - 检查以防万一,你知道,MS 决定帮开发者的世界一个忙。
  • 通行证 - Windows 10 上的 IE 11(版本 11.786.15063.0)
  • Pass - Windows 10 上的 Edge(版本 40.15063.674.0)
  • Pass - Windows 7 和 Mac OS 11.6 上的 Chrome(版本 63.0.3239.132 和 63.0.32.132)
  • Pass - Mac OS 11.6 上的 Opera(版本 50.0.2762.67)
  • Pass - Mac OS 11.6 和 Windows 7 上的 Firefox(版本 54.0.4 和 47.0.2)
  • Pass - Mac OS 11.6 上的 Safari(版本 11.0.3)

您可以在这里测试您的浏览器是否支持 308 重定向:http://webdbg.com/test/308/

建议使用 301 或 307 作为当前解决方案,直到 IE 和/或 Windows 7 和 8.1- 死于可怕而痛苦的死亡(因为微软不打算ever 在 Windows 7/8.1 上为 IE 添加 308 支持)。

[编辑 2020 年 1 月 29 日] 因此,对 Windows 7 的官方支持在本月早些时候(准确地说是 1 月 14 日)结束,现在强烈鼓励该平台上的用户升级到 Win10,因此预计会出现急剧下降使用统计


0
投票

当前所有浏览器都支持 308s (AFAIU)。

https://greenbytes.de/tech/tc/httpredirects.


-4
投票

更新:

我原来的回答得到了很多反对票。这是我更新的答案。我原来的答案仍然可以在下面找到。

您可以通过检查 upgrade-insecure-requests 标头来检测支持 308 响应的浏览器。现代浏览器发送的几乎所有请求都使用此标头。缺少此标头并不一定意味着缺少 308 支持,但您可以提供一个模拟 308 响应的回退,如下所示:

function _308($location) {
    header('vary: upgrade-insecure-requests');// Don't cache if header varies
    if (!empty($_SERVER['HTTP_UPGRADE_INSECURE_REQUESTS'])) {
        // Safe to use 308 response code
        header('location: '.$location, true, 308);
    }
    elseif (in_array($_SERVER['REQUEST_METHOD'], ['GET','HEAD'])) {
        // When the request method is GET or HEAD a 301 response will suffice.
        header('location: '.$location, true, 301);
    }
    else {
        // 307 responses were introduced in 1999 and are now universally supported.
        // Browsers respond the same as with 308 when request method is POST.
        header('location: '.$location, true, 307);
    }
    exit;
}

这似乎比我提供的获得 4 票反对票的解决方案更好的答案(如下)。 HTTP/2 网络浏览器确实普遍支持 308 响应,但检测浏览器对 HTTP/2 服务器端的支持通常是不可行的。


原答案:

308 重定向是在 HTTP/2 之前引入的。因此理论上所有支持 HTTP/2 的浏览器都支持 308 重定向,并且可以通过检测 HTTP/2 或更好的使用来检测兼容性。显然,这仅在您的 Web 服务器支持 HTTP/2 并且您不在 CDN 后面时才有效。

所以你应该做的是检测服务器协议。如果使用 HTTP/2 或更高版本,您可以使用 308 重定向并相信它会按预期工作。否则使用 307 重定向,该重定向自 1999 年左右就已经存在,并且在所有现代浏览器中都受支持。实际上,无论如何,当请求方法为 POST 时,308 和 307 的处理方式相同,因为在这种情况下两者都没有被缓存。

如果这还不够好,我建议在网页正文中包含一个表单,该表单可用于在新位置重新提交已提交的 POST 变量。如果无法识别 307/308 响应代码,将向用户显示表单,并且可以手动完成重定向。请参阅 RFC 2616:

临时 URI 应该由 Location 字段给出 回复。除非请求方法是 HEAD,否则 响应应该包含一个简短的超文本注释,带有指向 new URI(s) ,因为许多 HTTP/1.1 之前的用户代理不理解 307状态。因此,注释应该包含信息 用户有必要在新的 URI 上重复原始请求。

https://www.rfc-editor.org/rfc/rfc2616#page-65

© www.soinside.com 2019 - 2024. All rights reserved.