404错误处理:重定向还是直接404?(摘录)

小型网站开发通常会使用某种Web应用框架,比如类似Spring、Express、Django等框架。 这些框架会给出自定义错误页面的方式。当404发生时Web框架会渲染并返回对应的错误页面。 这是最自然和直接的错误处理方式,但有时我们希望错误页面可以单独Serve,比如放到CDN上。 本文档依据RFC 2616(HTTP 1.1)比较几种常见的404错误处理方法:

  • 返回具有404信息的页面,同时给出404状态码。

    Google、Github、Facebook、Amazon、Linkedin。

  • 重定向(302/303)至错误URL,该URL给出具有404信息的页面。

    百度、淘宝、腾讯

状态码及其语义

使用最广的HTTP标准当属1999年发布的HTTP/1.1, R. T. Fielding 在2000年的博士论文 “Architectural Styles and the Design of Network-based Software Architectures” 中重申如何正确使用HTTP语义以及REST架构风格。 符合标准的HTTP消息拥有透明的、自描述的语义,通信方遵循一致的标准才使得整个互联网得以高效地运行。

HTTP状态码对用户不可见,因为Web页面返回给用户之后页面代码并非直接显示给用户, 而是经由用户代理(User Agent,比如浏览器、爬虫等)处理。 状态码的重要性在于它告诉用户代理当前页面的状态,借此用户代理才能做出正确的操作: 比如刷新当前页面,或者访问另一个URL,重置或重新提交表单等等。

HTTP状态码有很多,本文档只关心其中的404,200,以及302/303状态码。

200

请求成功。对于GET,应当返回被请求资源的实体;对于POST,应当返回操作的结果。

RFC 2616: 10.2.1

The request has succeeded. The information returned with the response
is dependent on the method used in the request, for example:

GET   an entity corresponding to the requested resource is sent in
          the response;
POST  an entity describing or containing the result of the action;

302

被请求的资源暂时位于另一个URI处,并且对于非HEAD/GET请求, 用户代理在重定向前必须询问用户确认。

RFC 2616: 10.3.3

The requested resource resides temporarily under a different URI.
Since the redirection might be altered on occasion, the client SHOULD
continue to use the Request-URI for future requests. This response
is only cacheable if indicated by a Cache-Control or Expires header
field.

RFC 1945 和 RFC 2068 规定客户端不允许更改请求的方法。但很多浏览器会将302当做303来处理。

303

被请求的资源暂时位于另一个URI处,并且应当以GET方法去请求那个资源。

RFC 2616: 10.3.4

The response to the request can be found under a different URI and
SHOULD be retrieved using a GET method on that resource. This method
exists primarily to allow the output of a POST-activated script to
redirect the user agent to a selected resource. The new URI is not a
substitute reference for the originally requested resource. The 303
response MUST NOT be cached, but the response to the second
(redirected) request might be cacheable.

404

服务器未能找到URI所标识的资源。也常被用于服务器希望隐藏请求被拒绝的具体原因。 例如403、401可能会被统一处理为404。

RFC 2616: 10.4.5

The server has not found anything matching the Request-URI. No
indication is given of whether the condition is temporary or
permanent. 

This status code is commonly used when the server does not wish to
reveal exactly why the request has been refused, or when no other
response is applicable.

直接404

直接404是常见Web框架的通用做法:对于每一个用户请求遍历所有可能的路由, 如果任何一个控制器都不处理该请求,则Web服务器返回一个具有404状态码的HTTP响应。

404状态码告诉用户代理(User Agent)请求中的URI所标识的资源不存在, 用户代理将该HTTP响应的主体(往往是HTML)显示给用户, 该HTML页面是终端用户可读的,通常也会包含Not Found信息,以及一些有用的链接。

爬虫是一种特殊的用户代理,通常用于搜索引擎。当搜索引擎的爬虫发现某URI返回404状态码时, 会认为该URI已经失效而不对它进行索引,或者将该URI标识的已索引资源移除。 所以是网站迁移时,如果一个旧的URI会位于一个新的URI处,应当使用301重定向来告知搜索引擎: 该资源并未失效只是位置发生变化。

当我们无法控制服务器返回301时,也可在返回的HTML中使用特殊标记 来告知用户代理这是一个301,这在迁移静态站点时非常有用。

404的一个问题在于不支持CDN。如果为了提升性能使用CDN服务, 将404.html文件托管到CDN提供商,访问该文件显然会返回200状态码。 因为CDN服务器认为你所访问的文件存在。

重定向至错误页面

在国内网站中更常见的方式是将所有错误重定向至错误页面,比如error.html。 当用户代理访问error.html时服务器返回状态码为200,这便是神奇的200 Not Found。 200 Not Found显然不符合HTTP语义标准,下面从搜索引擎和CDN两个方面评价该方法的优劣:

搜索引擎非常不友好。当一个页面Not Found时爬虫并不知情,因为它收到的状态码是303。 于是跟随重定向并索引了错误页面error.html。这意味着该网站会有大量的URL都拥有同样的内容(404页面), 网站会因此受到搜索引擎的惩罚而排名下降。

优点

国内不少公司选择重定向的错误处理方式,笔者总结该方式的优点:

  • 固定的错误页面可以直接托管于CDN,通过CDN统计和脚本的方式来统计错误。
  • 固定的URL可以支持更加松耦合的架构,只需约定重定向URL即可构建前后端通用的错误处理。
  • 最重要的是简单稳定,不会对外暴露错误详情。

缺点

200 Not Found 的缺点是愤青所不能接受的,总结如下:

报警级别降低

404 是失败而 302/200 是成功,这会让开发者忽略错误甚至引发意外后果。

  • 资源文件发生 MIME Type 报警而非 404 错误。
  • 当 AJAX 请求被重定向时,可能会引发意外后果。

发生意外错误

意外的错误显然会浪费大量的调试时间。 这一件事 Harttle 认为熟并不能能生巧: 当一个开发者已经熟悉并接受 200 Not Found 环境下的调试时,他的价值观已经被扭曲。

  • 脚本、样式 Not Found 会发生解析错误(比如unexpected token <)而不是 404 错误。
  • 如果重定向至不同域(开发中很常见),CSS 中的字体等资源引起Access-Control-Allow-Origin错误。

调试困难

报警级别降低和意外错误的发生已经让调试变得更加困难,还有更困难的:

  • Network 控制台不再能显示哪个请求404,需要从错误页面请求的 Initiator 反推。
  • 从浏览器地址栏访问一个页面被302后,无法回退继续访问原页面。(因为 302 的语义让浏览器认为你就是要这个页面!)

参考

转载请注明来源: http://harttle.land/2016/08/03/error-page-404-or-200.html 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论(可能需要在能访问 disqus 服务的网络),也可以邮件至 [email protected]。

原文地址:https://www.cnblogs.com/mikeluwen/p/8861851.html

时间: 2024-08-08 15:02:54

404错误处理:重定向还是直接404?(摘录)的相关文章

404错误了该怎么办?

404错误提示页和301重定向是在网站seo优化工作中,经常用到的技术手段.,今天这篇文章将重点介绍如何定制网站404错误提示页面怎么做. 为了方便让客户方便定制自己的404错误提示页面, 下面将按照您网站的使用环境一一讲解,请您根据自己的实际情况,选择对应的情况操作.(如搞不清楚,也可以咨询鼎峰网络在线专家工程师为您解答) 一.定义404错误提示页面前的准备 1.自己做一个404错误提示页面.首先,您需要自己做一个404错误提示也页面.如果您还没有,小D已经为您准备了一个, 2.把做好的404

如何设置http 404错误?

404错误提示页和301重定向是在网站seo优化工作中,经常用到的技术手段.鼎峰网络小D在上一篇“Linux空间图文详细讲解如何设置301”中做了详细介绍,今天这篇文章将重点介绍如何定制网站404错误提示页面怎么做. 为了方便让客户方便定制自己的404错误提示页面, 下面将按照您网站的使用环境一一讲解,请您根据自己的实际情况,选择对应的情况操作.(如搞不清楚,也可以咨询鼎峰网络在线专家工程师为您解答) 一.定义404错误提示页面前的准备 1.自己做一个404错误提示页面.首先,您需要自己做一个4

404错误的调试分析 - 运行JSP动态网页Tomcat老是报404错误(详解)

一.开发JSP动态网页时,我们通过浏览器请求服务器上的某个资源的时候,或许会经常遇到报404错误的bug. 问题分析:出现这个bug的原因可能处在JSP网页里面,也可能是Servlet里面.假如要访问的资源不存在,就会产生404错误. (1)404错误可能是应用本身的问题.例如没有正常部署.web.xml部署时Servlet名字写错了 (2)也可能是文件的问题,JSP文件不存在.JSP名字打错了,或者Servlet没有配置 二.关于servlet配置参数url-pattern(Servlet路径

NGINX 配置404错误页面转向

什么是404页面 如果碰巧网站出了问题,或者用户试图访问一个并不存在的页面时,此时服务器会返回代码为404的错误信息,此时对应页面就是404页面.404页面的默认内容和具体的服务器有关.如果后台用的是NGINX服务器,那么404页面的内容则为:404 Not Found 为什么要自定义404页面 在访问时遇到上面这样的404错误页面,我想99%(未经调查,估计数据)的用户会把页面关掉,用户就这样悄悄的流失了.如果此时能有一个漂亮的页面能够引导用户去他想去的地方必然可以留住用户.因此,每一个网站都

nginx下配置404错误页面

1.创建自己的404.html页面,并放于网站根目录. 2.更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on; 3.更改nginx.conf(或单独的网站配置文件) 在server 区域加入: error_page 404 /404.html 或者 error_page 404 http://www.xxx.com/404.html(不建议用这个绝对路径,有人反映会返回200,但是我测试是可以的,两边不要=) 4.测试nginx.conf正

当CodeIgniter遇到Nginx报404错误的解决办法

由于CodeIgniter当初是设计在apache的,而apache对pathinfo是支持比较好的,所以一切都很nice.但是当你把写好的代码放到nginx上,傻眼了,可能出了CodeIgniter的welcom之外,其他都是404错误.而我惊奇的发现,CodeIgniter的官方文档竟然对在Nginx上的配置只字不提.而你百度"CodeIgniter Nginx 404"又能搜到一堆一堆的文章,奇葩的是几乎每个文档的配置方法貌似还不大一样.如果你搞好了还罢,搞不好就是配几个晚上都搞

一个项目的404错误处理页面

可以从网站上404模板,下载后进行修改即可. 一个项目难免会出现404页面,为了防止404错误暴露给用户,需要提前做好404页面.在404页面中给用户友好的提示,同时可以自动重定向到项目的主页. web.xml配置404页面 <!-- 404页面 --> <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page>

浅析制作404错误页面时应该注意的问题是那些

1.制作的404页面不要出现200状态码 当用户访问的页面不存在的时候,服务器只有返回404的错误状态码才算正常,有些站长设置了404页面之后,在访问这些不存在页面时, 服务器返回的却是200状态码,那么这样搜索引擎就会把这些错误页面当做是大量的重复页面来对待,因此这样不利于网站优化.另外最好也不要使用301重定向把错误的404页面直接跳转到首页,这样搜索引擎就会认为网站存在大量与首页内容相同的页面,另外最好不要使用低于10秒以下的跳转,比如JS或者meta refresh等,否则搜索引擎会认为

ecshop中404错误页面设置

在ecshop系统当中,比如你随意将商品详细页面的地址中的ID修改为一个不存在的商品ID,ecshop会自动跳转到首页.ecshop在这方面做得非常的差,甚至导致了很多的站不被搜索引擎收录.最模板提供该ecshop教程分析如下: 1.分析:ECSHOP程序文件category.php及goods.php等页面多处存在以下这样的代码:ecs_header("Location:./\n");exit;以上代码的意思是,如果找不到当前ID下的分类或者商品,则跳转到网站首页.这样子跳转,返回的