当用户请求一个网页时,服务器会根据请求的URL生成相应的响应,比如HTML、CSS、JavaScript文件等。用户每次打开网页时,浏览器都会从服务器上重新请求这些文件,这会导致大量的请求,降低网站的性能和响应速度。为了解决这个问题,HTTP协议提供了304状态码。这个状态码表示请求资源未被修改,服务器可以通过发送304状态码来告诉浏览器直接使用本地缓存。
呢?以下是一些常用的方法:
1.在服务器配置文件中启用缓存
服务器配置文件是一个包含各种设置的文本文件,可以用来修改服务器的行为。在配置文件中启用缓存可以帮助服务器检测资源是否已被修改。在Apache服务器上,可以通过在配置文件中添加以下代码来启用缓存:
ExpiresActive On
ExpiresByType text/html “access plus 1 days”
ExpiresByType text/css “access plus 1 days”
ExpiresByType application/javascript “access plus 1 days”
此代码指示服务器启用缓存,并设置资源的过期时间为1天。如果一个资源在这个时间内被修改,则服务器会重新发送该资源的完整版本。如果未被修改,则服务器将发送304状态码。
2.使用条件GET请求
条件GET请求是一种HTTP请求,只有在资源被修改时才会返回完整版本,在资源未被修改时会返回304状态码。条件GET请求可以通过在HTTP请求头中添加If-Modified-Since和If-None-Match字段来实现。例如:
GET /index.html HTTP/1.1
Host: www.example.com
If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT
If-None-Match: “342d09-25a-521f3f64”
这个请求中,浏览器指示服务器只返回在If-Modified-Since字段中指定时间之后修改过的文件。如果未修改,则服务器会返回304状态码。
3.使用ETag标记
ETag是一种HTTP响应头,用于标识资源的版本号。当资源被修改时,ETag值也会随之更改。浏览器可以在发送请求时将ETag值包含在请求头中,以便服务器检查资源是否已被修改。如果没有修改,则服务器可以发送304状态码。以下是一个使用ETag标记的HTTP响应头的示例:
HTTP/1.1 200 OK
Date: Fri, 19 Nov 2023 05:03:07 GMT
Server: Apache/2.4.18 (Ubuntu)
ETag: “342d09-25a-521f3f64”
Content-Length: 5979
Content-Type: text/html; charset=UTF-8
这个响应头包含一个ETag标记,表明这个资源的版本号为“342d09-25a-521f3f64”。浏览器可以在发送请求时将这个标记作为If-None-Match字段的值,以便服务器检查资源是否已被修改。
在实现服务器304验证时,请注意以下几点:
1.必须正确设置缓存时间,否则缓存可能会过期。
2.使用条件GET请求时,必须将资源的最后修改时间、ETag标记和缓存头文件正确设置。
3.ETag标记必须正确设置,否则服务器可能会误判资源是否已被修改。
:
服务器304验证可以减少服务器负载和提高网站性能。本文介绍了几种常用的方法来实现服务器304验证。无论您是一个网站管理员还是一个开发人员,学习这些技术将有助于优化您的网站并提高用户体验。
相关问题拓展阅读:
- 304 Not Modified要怎么解决
- HTTP 状态消息分别表示什么?
304 Not Modified要怎么解决
当你之一次访问时,服务器会返回给你200状态码,同时在头里追加ETag值给你。浏览器拿到后将其缓存。
下一次再访问时,因浏览器已经有该地址的ETag值了。会将其缓存的ETag值内容放在请求头的If-None-Match中,服务器检查其自身内容的ETag值是否与其一致,如果一致就会返回
304状态码
,告诉你内容和你保存的一致,没有发生改变过。
举例来说,
C:S,你几岁了?
S:C,我18岁了。
===========
C:S,你几圆羡辩岁了?我猜你18岁了。
S:靠,你知道还问我?(304)橘缺
===========
C:S,你几岁了?我猜你18岁了。
S:C,我19岁了。(200)
以上就是200和304的解释。
Cache-Control和Expires则是告诉浏览器缓存这些数据的策略。
drupal则并非是非法hash导致的问题,问题在于gzip上。gzip其实就是gunzip了。ZIP压缩会有个特点,相同的内容重复压缩得到的
二进制
是不一样的,这和其字典策略派明相关(猜测,未验证),你可以随便压缩个文件对比2次的ZIP包checksum值是否一致来确认。那么这样就可以解释了,虽然原始内容没有改变,但是传输时因为用了gzip,所以drupal认为原始数据始终在改变,每次返回200也符合我先前所讲的内容。
最后,根据REST的原则,可以看出一些请求是幂等的,一些请求是非幂等的。那么服务器与客户端之间的缓存层,比如CDN也好,drupal,或者nginx等,都会对幂等请求做缓存策略,非幂等请求不做缓存策略。这里如何来控制,则需要服务器端在返回内容时利用好Cache-Control和Expires等头信息来进行。
HTTP 状态消息分别表示什么?
状态码【200】表示【请求成功】,一般在GET和森亩POST请求中可以见到;
状此带森态码【302】表示【资源临时移动】;
状态码【304】表示【所请求的资源并未修改】;
状态码【403】表示【服务器拒绝执行客户端的请求】;
状态码【404】表示【服务器找不到客户端所行悉请求的资源(网页)】;
状态码【500】表示【服务器内部错误】。
code说明
200请求被成功处理
304页族埋面未孝衡修改
302临时性巧穗做重定向
403没有权限访问
404标识没有对应的资源
500服务器错误
503服务器停机或正在维护
关于去服务器304验证的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。