标题404与标题400:url解析错误

时间:2015-07-22 14:06:39

标签: php regex url http-status-code-404 http-status-code-400

我正在编写自己的小php框架。我想把所有内容写成尽可能语义,然后我就堆积了。

我有一个url解析class。它解析整个URL(方案,子域,域,资源和查询)。接下来,router课程决定如何处理此url。如果有与url相对应的资源,则“渲染”它,如果没有渲染404,如果资源被禁止则渲染403等等...问题是什么:

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

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

当然两个网站都不存在。但是标题应该是什么样的?我在预测:

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

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

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

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

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

但是这个问题在搜索引擎优化的情况下有点严重。在定位的情况下,400与404完全不同。用你自己的方式设计400页是很好的,并且对某人说“找不到页面”,但是“你是不是想把一些东西注入我美丽的网址? 这是一个不好的请求!

1 个答案:

答案 0 :(得分:2)

据我所知,IETF RFC2616应该为已经成形的请求返回400(即不符合IETF RFC3986,而对于不存在的资源应该返回404(410)应该返回曾经存在但现在已经消失的资源。

在上面的示例中,带有%-sign后跟两个十六进制字符的网址肯定是商品化的(例如en.mysite.com/&%($^&# www.google.com/%& (#$*%&@^)。同样格式错误的是在最后一部分中有两个?(问号标记)的查询。

可以在回答问题时找到网址的正则表达式:PHP validation/regex for URL

相关问题