是否可以 return HTTP 代码 200,但在不使用 3xx 的情况下给出 "better" url?

Is it possible to return HTTP code 200, but give a "better" url without using 3xx?

考虑 Whosebug,其中每个问题都有一个唯一的 ID,但 URL 经常被覆盖以在 URL 中包含一个存根。出于可读性和其他原因,存根帮助用户知道他们在正确的地方。

我有一个网站,在调用 URL 时 returns 200,例如:


但希望 URL 更新为:

is-it-possible-to-return-http-code-200-but-give-a-better-url-without-using-3x

第一个调用在技术上是有效的,代码可以检索 object 并完美地呈现它,但我想更新 URL 以使用模糊的。

我更愿意在没有重定向的情况下执行此操作,因为仅获取 ID 会导致数据库调用获取 object。这意味着重定向过程将是:

  1. 致电
  2. 从数据库中检索项目 25257999 以获取制作存根的名称
  3. 重定向到 is-it-possible-to-return-http-code-200-but-give-a-better-url-without-using-3x
  4. 新的 HTTP 调用,因此从数据库中检索项目 25257999 以呈现最终页面。

如果可能的话我也不想使用Javascript。

那么,是否可以 return Location 作为状态代码 200 和实际页面的 HTTP header 的一部分,或者我卡住了使用 3xx 调用或 Javascript?

如果你只是做HTTP,你可以选择重定向,或者不选择重定向...你也可以(使用Content-Location)告诉客户端规范地址实际上在其他地方...但没有浏览器会对此做出响应。

为了避免数据库调用,您当然可以只缓存结果。

但是,如果您在浏览器中,则可以动态更新当前地址而无需强制刷新,window.history.pushState

有关该调用的更多信息,请参阅其他 SO 答案:

Modify the URL without reloading the page