HTTP / 重定向到服务器上的 URI

HTTP / 重定向到服务器上的 URI

我想将某个 URI 重定向到同一服务器上的新 URI。这可以通过发送带有 3xx 代码和“Location”标头的响应来实现。现在 HTTP/1.1 标准规定这应该是“绝对 URI”。(请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30

那么他们所说的“绝对 URI”到底是什么意思呢?在给出的示例中,它们包括了完整的 URI,包括协议、主机名和路径。现在我想重定向到同一台服务器上的 URI,并且我知道路径。这是一个绝对 URI(从根开始),但没有主机名和协议。事实上,服务器可能不知道自己的主机名,并且很难构造完整的 URI。

根据 HTTP/1.1 标准,发送不带主机名和协议的 URI 是否也有效?我尝试过这个,我测试的每个浏览器似乎都能理解它。我的问题是:这样做正确吗?

响应示例:

HTTP/1.1 303 See Other
Location: /path/to/other

代替:

HTTP/1.1 303 See Other
Location: https://hostname.com/path/to/other

答案1

根据 HTTP/1.1 标准,发送没有主机名和协议的 URI(在位置标头中)是否也有效?

不是,因为“absoluteURI”的定义方式。既然你正在看 RFC,那么我们就坚持使用它们来进行讨论。备份:

那么他们所说的‘绝对 URI’到底是什么意思呢?

它在其他地方定义。这种情况发生经常

现在我想重定向到同一服务器上的 URI,并且我知道路径。这是一个绝对 URI(从根目录开始),但没有主机名和协议。

这可能是绝对的小路,但这并不意味着它绝对URI

来自 HTTP/1.1 RFC 第 3.2.1 节,通用语法:

有关 URL 语法和语义的确切信息,请参阅“统一资源标识符 (URI):通用语法和语义”,RFC 2396 [42](取代了 RFC 1738 [4] 和 RFC 1808 [11])。本规范采用了该规范中的“URI 引用”、“绝对 URI”、“相对 URI”、“端口”、“主机”、“绝对路径”、“相对路径”和“权限”的定义。

看着RFC 2396

   absoluteURI   = scheme ":" ( hier_part | opaque_part )

即使不深入研究 BNF,也需要“方案”部分(“http”或“https”)。我将省略对规则构建的实际讨论,但由于字符串开头需要“http:”或“https:”,因此您无法删除 URI 的网络部分。

我尝试过这个,并且我测试的每个浏览器似乎都能理解它。

波斯特尔定律在工作中。您做错了什么,但浏览器还是理解了。您应该遵循它并在Location:标头中发送正确的绝对 URI。如果它无法在您的环境中轻松构建,则一定有问题;我想不出我见过的任何 Web 应用程序的主机信息不可配置或不可检索。

答案2

他们似乎没有明确说明是否应该包含服务器名称和协议。如果你知道谁会使用你的 HTTP 服务,你可以简单地测试一下,看看是否顺利。

另外,在服务器中知道请求的 URL 并构造包含协议和主机名的绝对 URL 并不困难。例如,您可以$_SERVER在 PHP 中使用数组。其他 Web 语言应该有类似的预定义变量。

相关内容