HTTP /redirect到服务器上的URI

我想redirect一个特定的URI到同一台服务器上的一个新的。 这可以通过发送具有3xx代码的响应和“位置”标题来完成。 现在HTTP / 1.1标准规定这应该是一个“绝对的URI”。 (见http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30 )

那么他们究竟是什么意思的“绝对的URI”? 在给出的例子中,他们包括完整的URI,协议,主机名和path。 现在我想redirect到同一台服务器上的URI,我知道path。 这是一个绝对的URI(它从根开始),但没有主机名和协议。 事实上,服务器可能不知道自己的主机名,并且很难构build完整的URI。

根据HTTP / 1.1标准,是否也有效地发送一个没有主机名和协议的URI? 我试过了,我testing的每个浏览器似乎都明白了。 我的问题是:这样做是正确的吗?

示例回应:

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

代替:

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

根据HTTP / 1.1标准,在没有主机名和协议的情况下发送一个URI [位置标题]也是有效的吗?

不,因为“absoluteURI”是如何定义的。 既然你正在看一个RFC,让我们坚持这个讨论。 备份:

那么他们究竟是什么意思的“绝对的URI”?

它在别处被定义。 这经常发生。

现在我想redirect到同一台服务器上的URI,我知道path。 这是一个绝对的URI(它从根开始),但没有主机名和协议。

这可能是一个绝对path ,但这并不是绝对的URI

从HTTP / 1.1 RFC的3.2.1节,通用语法:

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

看RFC 2396 :

  absoluteURI = scheme ":" ( hier_part | opaque_part ) 

即使没有通过BNF潜水,“计划”部分(“http”或“https”)是必需的。 在这里,我将省略对规则构build的实际讨论,但是由于在string的开始处需要“http:”或“https:”,因此无法删除URI的networking部分。

我试过了,我testing的每个浏览器似乎都明白了。

Postel的法律在工作。 你做错了什么,但是浏览器无论如何都能理解。 你应该遵循它,并发送一个正确的绝对URI与您的Location:标题。 如果在你的环境中不能很容易地build立起来, 我想不出任何我看过的主机信息不可configuration或可检索的Web应用程序。

看来他们没有明确地说明是否应该包含服务器名称和协议。 如果你知道谁将使用你的HTTP服务,你可以简单地testing它,看看它是否顺利。

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