【问题标题】:Header 404 vs Header 400: url parsing error标头 404 与标头 400:url 解析错误
【发布时间】:2015-10-12 11:15:14
【问题描述】:

我正在编写自己的小 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;amp;但一般规则是什么?规范中是否有任何 url 正则表达式?


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

但是在 SEO 的情况下这个问题有点严重。 因为 400 与 404 在定位的情况下完全不同。以您自己的方式设置 400 页面的样式非常好,并且 对某人说不是“找不到页面”而是“你想在我美丽的 url 中注入一些东西吗? 这是一个错误的请求!

【问题讨论】:

  • 你的系统决定什么是“坏的”取决于你。 RFC2616 w3.org/Protocols/rfc2616/rfc2616-sec10.html 中没有任何内容。但是你可以使用 RFC3986 来分析 URL 的格式是否正确。
  • 感谢您的回复和直接 w3.org 链接。根据它真的一切都留给服务器......但这句话很有趣:400:“客户端不应该在没有修改的情况下重复请求”。这是否意味着在现代浏览器中,此标头被缓存在浏览器端,甚至不会发送所有未来的请求?有点离题,但在这种情况下,404 可能会更好......BR!
  • 是的。但它不应该不应该不,所以谁知道^^

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。我想它打消了我所有的疑惑。如果你不介意我会稍等一下接受点击,也许有人现在正在创建一个“百科全书”的答案:)。来自我的 +1。
猜你喜欢
  • 2012-05-30
  • 2018-04-29
  • 2010-11-08
  • 2019-10-08
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
相关资源
最近更新 更多