【发布时间】:2018-10-03 20:54:29
【问题描述】:
我尝试了以下请求:
GET index.htm HTTP/1.1
connection: close
host: example.com
content-length: 0
但获得了 400 错误请求。为什么?服务器应该能够拼凑绝对 URL:http://example.com/index.htm。它为什么抱怨?我是否需要引用标头才能在请求行上使用相对 URL?
【问题讨论】:
我尝试了以下请求:
GET index.htm HTTP/1.1
connection: close
host: example.com
content-length: 0
但获得了 400 错误请求。为什么?服务器应该能够拼凑绝对 URL:http://example.com/index.htm。它为什么抱怨?我是否需要引用标头才能在请求行上使用相对 URL?
【问题讨论】:
您不能使用相对路径,因为 HTTP 规范 (RFC7230) 要求使用绝对路径。
如果您只是参考 HTTP 规范,很容易找出为什么您的请求得到 400 Bad Request 响应:它违反了规范。
RFC7230 定义在您的场景中,请求目标必须使用需要绝对路径的所谓 origin-form:
origin-form = absolute-path [ "?" query ]
例如,http://example.org/where?q=now 的 HTTP 请求将是:
GET /where?q=now HTTP/1.1
Host: example.org
如果路径为空,例如http://example.org,HTTP 请求将是:
GET / HTTP/1.1
Host: example.org
这是因为需要绝对路径,如Section 5.3.1 中所述(强调我的):
直接向源服务器发出请求时,而不是 CONNECT 或服务器范围的 OPTIONS 请求(如下所述),客户端 必须仅发送目标的绝对路径和查询组件 URI 作为请求目标。
【讨论】:
/开头”更高级和抽象。
我认为GET index.htm HTTP/1.1 这一行缺少index.html 上的“l”。
希望有帮助!
【讨论】:
我找到了答案:如果请求行上的 URL 不是绝对的,则它必须是绝对路径。这意味着您可以省略协议和主机名,但不能省略路径的任何部分。以下工作:
GET /index.htm HTTP/1.1
connection: close
host: example.com
content-length: 0
【讨论】: