【发布时间】:2023-03-26 14:51:01
【问题描述】:
我的网站有 1% 的随机机会将访问者重定向到 this YouTube video.
服务器当前发送旧的 302,但我希望它具有更好的语义。
我不知道重定向是永久的还是临时的。它是永久性的,因为人们总是有 1% 的机会被重定向,而它是暂时的,因为人们不会每次都被重定向。
当前的 3xx 响应状态代码均不符合我网站的行为。
HTTP 3xx 重定向(来源:维基百科)
301 永久移动
这个和所有未来的请求都应该被定向到给定的 URI。[21]
“这个和所有未来的请求” - 不,不是所有未来的请求。
找到 302(以前“暂时移动”)
告诉客户端查看(浏览到)另一个 url。 302 已被 303 和 307 取代。这是行业实践与标准相矛盾的一个例子。 HTTP/1.0 规范 (RFC 1945) 要求客户端执行临时重定向(最初的描述短语是“临时移动”),[22] 但流行的浏览器使用 303 See Other 的功能实现了 302。因此,HTTP/1.1 添加了状态码 303 和 307 来区分这两种行为。 [23]但是,一些 Web 应用程序和框架使用 302 状态代码,就好像它是 303。[24]
这令人困惑。它确实声明“302 已被 303 和 307 取代”,所以我猜这已经过时但仍然普遍使用?
303 查看其他(从 HTTP/1.1 起)
可以使用 GET 方法在另一个 URI 下找到对请求的响应。当收到响应 POST(或 PUT/DELETE)时,客户端应假定服务器已收到数据,并应向给定 URI 发出新的 GET 请求。[25]
“可以在另一个 URI 下找到对请求的响应”- Rickroll 不是对原始请求的响应。它与我的网站无关! “当收到响应 POST(或 PUT/DELETE)时,客户端应假定服务器已收到数据,并应向给定 URI 发出新的 GET 请求。” 303 描述的最后一句话不适用于我的重定向。
307 临时重定向(从 HTTP/1.1 起)
在这种情况下,应该使用另一个 URI 重复请求;但是,未来的请求仍应使用原始 URI。与历史上的 302 实现方式不同的是,在重新发出原始请求时,不允许更改请求方法。例如,应该使用另一个 POST 请求重复一个 POST 请求。[30]
“在这种情况下,应该使用另一个 URI 重复请求;但是,未来的请求仍应使用原始 URI。”是的!这就是我的重定向。 “...重新发出原始请求时,不允许更改请求方法。例如,应该使用另一个 POST 请求重复一个 POST 请求。”不幸的是,这不适用于我的重定向。即使用户提交表单(POST 方法),我的网站也会随机 Rickrolls 用户。
308 永久重定向 (RFC 7538)
应使用另一个 URI 重复该请求和所有未来的请求。 307 和 308 与 302 和 301 的行为平行,但不允许更改 HTTP 方法。因此,例如,将表单提交到永久重定向的资源可能会顺利进行。[31]
308 与 301 存在相同的问题,因为并非所有未来的请求都应该转到 Rickroll 视频。此外,方法不允许更改。
对于与我的实际站点无关的随机重定向,我的服务器应该发送什么 HTTP 响应状态代码?
【问题讨论】:
标签: http redirect server http-status-codes http-redirect