目录 背景
原因
解决方法
参考
背景
遇到一个问题,客户访问我们系统(缓存系统),发现大量412。
原因
查看了412的原因:
在 HTTP 协议中,响应状态码 412 Precondition Failed(先决条件失败)表示客户端错误,意味着对于目标资源的访问请求被拒绝。这通常发生于采用除 GET 和 HEAD 之外的方法进行条件请求时,由首部字段 If-Unmodified-Since 或 If-None-Match 规定的先决条件不成立的情况下。这时候,请求的操作——通常是上传或修改文件——无法执行,从而返回该错误状态码。
那么,相关的两个请求头又是什么含义呢?
If-Unmodified-Since HTTP协议中的 If-Unmodified-Since 消息头用于请求之中,使得当前请求成为条件式请求:只有当资源在指定的时间之后没有进行过修改的情况下,服务器才会返回请求的资源,或是接受 POST 或其他 non-safe 方法的请求。如果所请求的资源在指定的时间之后发生了修改,那么会返回 412 (Precondition Failed) 错误。 If-None-Match If-None-Match 是一个条件式请求首部。对于 GET 和 HEAD 请求方法来说,当且仅当服务器上没有任何资源的 ETag 属性值与这个首部中列出的相匹配的时候,服务器端会才返回所请求的资源,响应码为 200 。对于其他方法来说,当且仅当最终确认没有已存在的资源的 ETag 属性值与这个首部中所列出的相匹配的时候,才会对请求进行相应的处理。
总结来说,是由于上面两个请求头校验不通过,导致返回了412。
由于客户请求是GET请求,猜测应该是If-Unmodified-Since头域引起的。打印出来后,果然证实了猜测。客户请求携带的If-Unmodified-Since请求头中的时间,比我们服务器中缓存的Last-Modified的时间早了好几天。
解决方法
原因找到,很好解决。跟客户沟通后,将If-Unmodified-Since请求头删除后,就恢复正常了。
参考
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/412
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/If-Unmodified-Since
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/If-None-Match