对于包含 " 或 %22 的网址,return 的 HTTP 响应代码是什么?

What HTTP Response code to return for urls containing " or %22?

https://www.rfc-editor.org/rfc/rfc7230#section-3.1.1 个无效请求行的接收者应该用 400 - 错误请求 响应。因此,根据 RFC,请求 GET /cat".html HTTP/1.1 应该 return 400.

我已经编写了一个服务器,它会 return 检测到 "。因此,通过 telnet 向我的服务器发出的请求 return 就是这样。

但是,当通过浏览器发送相同的请求时,GET /cat".html HTTP/1.1 会被浏览器转换为 GET /cat%22.html HTTP/1.1 发送。因此,400 没有被 return 编辑,而是 404 - Not Found 因为文件 cat%22.html 不在我的目录中public 目录。

我对 RFC 的要求感到困惑,因为它永远不可能通过浏览器发送 GET /cat".html HTTP/1.1 并且错误代码为 404 returned。由于 cat".html 是通过浏览器发送的错误请求,因此服务器应该 return 但这是不可能的,除非您在服务器中将 %22 编码为错误请求,但是 %22 在文件名中是有效的,因此不会是 400 错误请求 尽管它可能是 404 Not Found.

我在这里错过了什么?

HTTP 规范说 HTTP 请求,与浏览器无关规范是 HTTP(仅协议),不应包含 "。如果 you 尝试发送 " 你的浏览器是 url encoding 它到 %22 因为 " 无效(它正在帮助你)。所以这是好事吧?

it would never be possible to send GET /cat".html HTTP/1.1

您假设所有 HTTP 都是由浏览器生成的,但事实并非如此。许多技术和软件生成 HTTP。并非所有人都会 URL 为您编码您的请求。

顺便说一句:您不应该真的假设所有浏览器都会这样做,assume makes an ass-out-of-u-and-me ;)

TL;DR

如果您的 HTTP 包含实际 " return 一个 400

如果您的 HTTP 请求 url 将 " 编码为 %22 这是有效的,应该进行相应处理(这 可能 导致 404)