我正在编写自己的小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-_.#!]+
。我使用斜杠作为参数,所以我不需要? = &
。 但一般规则是什么?规范中是否有任何url正则表达式?
顺便说一句:对于那些会说404和喝熊的人:我可能会:)。
但是这个问题在搜索引擎优化的情况下有点严重。在定位的情况下,400与404完全不同。用你自己的方式设计400页是很好的,并且对某人说“找不到页面”,但是“你是不是想把一些东西注入我美丽的网址? 这是一个不好的请求!
答案 0 :(得分:2)
据我所知,IETF RFC2616应该为已经成形的请求返回400(即不符合IETF RFC3986,而对于不存在的资源应该返回404(410)应该返回曾经存在但现在已经消失的资源。
在上面的示例中,带有%-sign后跟两个十六进制字符的网址肯定是商品化的(例如en.mysite.com/&%($^&#
和www.google.com/%&
(#$*%&@^
)。同样格式错误的是在最后一部分中有两个?
(问号标记)的查询。
可以在回答问题时找到网址的正则表达式:PHP validation/regex for URL。