Header 404 与 Header 400:url 解析错误

Header 404 vs Header 400: url parsing error

我正在编写自己的 php 小框架。我想尽可能地写出语义化的东西,而且我已经堆积如山。

我有一个 url 解析 class。它解析整个 url(方案、子域、域、资源和查询)。接下来 router class 决定如何处理这个 url。如果有资源对应url它"renders"它,如果没有它渲染404,如果资源被禁止它渲染403,等等......问题是什么:

假设我的网站位于:http://en.mysite.com。假设页面 asd&*% 不存在。所以我有 2 url 的:

http://en.mysite.com/asd
http://en.mysite.com/&*%($^&#

当然这两个站点都不存在。但是 headers 应该是什么样子呢?我预测:

http://en.mysite.com/asd // header 404 Page not found
http://en.mysite.com/&*% // header 400 Bad request

然而(基于我们的大师网站):

http://whosebug.com/<<            // header 404
http://whosebug.com/&;:           // header 404
http://whosebug.com/&*%($%5E&#    // header 400 (which btw is not styled...)
https://www.google.com/%&*(#$*%&@^     // header 404...

规则是什么?每个系统都应该预测哪些符号适合 url 吗?至于我 url 应该只包含 [a-z0-9-_.#!]+。我使用斜线作为参数,所以我不需要 ? = &amp;但一般规则是什么?规范中是否有 url 正则表达式?


顺便说一句:对于那些会说放 404 然后去喝熊的人:我可能会:)。

但是在SEO的时候这个问题比较严重因为400和404在定位的时候是完全不一样的。以您自己的方式设计 400 页的样式非常好,并且 对不是 "page not found" 的人说,而是“您是否想在我美丽的 url 中注入一些东西? 这是一个错误的请求!

据我从 IETF RFC2616 得知,格式错误的请求应返回 400(即不符合 IETF RFC3986,而对于不存在的资源应返回 404 (对于曾经存在但现在已经消失的资源应该返回 410)。

在上面的例子中 URL 的 % 符号后面没有跟两个十六进制字符肯定是格式错误的(例如 en.mysite.com/&<em>% ($^&# www.google.com/%&</em>(#$*%&@^)。格式不正确的查询还有最后一部分有两个?(问号)。

可以找到 URL 的正则表达式来回答问题:PHP validation/regex for URL.