我想将某个 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 语言应该有类似的预定义变量。