问题现象
域名使用CDN加速后,针对部分请求资源CDN节点会返回304状态码。
问题原因
客户端首次向CDN服务器成功发送URL请求后,服务器会响应200状态码,内容是客户端请求的资源,同时会有一个Last-Modified的属性标记此文件在服务器端最后被修改的时间和一个用来核实内容是否修改过的Etag标记。等下次同一客户端再次向服务器发送相同URL请求时会携带文件最后修改时间和文件实体标签的请求头,服务器会根据携带的请求头比对文件修改时间和Etag标记判断文件内容在这期间是否修改过。如果服务器端的文件没有变化,则自动返回304(Not Changed)状态码,此时客户端会直接加载缓存内容;如果在此期间文件内容修改过,则服务器端把最新内容返回给客户端,并返回最新的文件修改时间和Etag,具体示例如下:
- 客户端首次成功访问一个文件时,服务器会返回200状态码,响应头中(Response Header)会携带标识文件最近修改时间的Last-Modified和Etag。
- 当客户端再次发起相同URL文件的访问时,客户端会携带请求头If-Modified-Since/If-None-Match值为首次请求该URL响应头Last-Modified/Etag的头部值(如下图所示),服务器会根据请求头中If-Modified-Since/If-None-Match携带的值对比Last-Modified和Etag是否一致来判断内容最近是否有做过变更。当文件和之前保持一致(未被修改过),则返回给客户端304状态码,如果文件内容变更过,则把最新内容返回客户端,同时响应200状态码。
解决方案
304状态码属于正常情况,说明请求的文件内容已经在客户端缓存中存在,而且在这段时间中对应的资源内容没有做过变更。在已有缓存的情况下,如果客户端希望重新拉取文件,可以通过“ Ctrl+F5 ”刷新的方式清除缓存,此时客户端会对服务器发起新的访问,且不会再携带If-Modified-Since/If-None-Match请求头,从而获取相应的文件内容和200状态码。