📅  最后修改于: 2023-12-03 15:37:41.442000             🧑  作者: Mango
在 HTTP 协议中,If-Modified-Since 是一个请求头部,用来检测服务器上的资源在某个时间之后是否有过修改。如果资源没有修改,服务器会返回 304 Not Modified 状态码,告诉客户端直接使用之前缓存的版本。
这个头部通常在 HTTP GET 请求中出现,例如:
GET /index.html HTTP/1.1
Host: example.com
If-Modified-Since: Sat, 01 Jan 2000 00:00:00 GMT
如果服务器上的 /index.html 资源自从 2000 年 1 月 1 日以来没有变化,服务器会返回以下响应:
HTTP/1.1 304 Not Modified
这样客户端就可以使用之前缓存的版本,而无需再次下载。
在本篇文章中,我们将介绍如何在不同的编程语言和框架中添加 If-Modified-Since 请求头部。
在 Node.js 中,可以使用内置的 http 模块或第三方的 request 模块来发送 HTTP 请求。下面是一个使用 http 模块发送 HTTP GET 请求并添加 If-Modified-Since 请求头部的例子:
const http = require('http');
const options = {
hostname: 'example.com',
path: '/index.html',
headers: {
'If-Modified-Since': 'Sat, 01 Jan 2000 00:00:00 GMT'
}
};
const req = http.request(options, (res) => {
if (res.statusCode === 304) {
console.log('Not modified, use cache');
} else {
console.log('Modified, download new version');
}
});
req.end();
在 Python 中,可以使用内置的 urllib 模块或第三方的 requests 模块来发送 HTTP 请求。下面是一个使用 urllib 模块发送 HTTP GET 请求并添加 If-Modified-Since 请求头部的例子:
import urllib.request
req = urllib.request.Request(
url='http://example.com/index.html',
headers={
'If-Modified-Since': 'Sat, 01 Jan 2000 00:00:00 GMT'
}
)
try:
with urllib.request.urlopen(req) as res:
if res.status == 304:
print('Not modified, use cache')
else:
print('Modified, download new version')
except urllib.error.HTTPError as e:
print(e.reason)
在 Ruby on Rails 中,可以使用内置的 Net::HTTP 模块或第三方的 HTTParty 模块来发送 HTTP 请求。下面是一个使用 Net::HTTP 模块发送 HTTP GET 请求并添加 If-Modified-Since 请求头部的例子:
require 'net/http'
require 'uri'
uri = URI.parse('http://example.com/index.html')
req = Net::HTTP::Get.new(uri)
req['If-Modified-Since'] = 'Sat, 01 Jan 2000 00:00:00 GMT'
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(req)
end
if res.code == '304'
puts 'Not modified, use cache'
else
puts 'Modified, download new version'
end
通过添加 If-Modified-Since 请求头部,客户端可以利用缓存加速页面加载,并减少带宽和服务器资源的开销。不同的编程语言和框架中添加 If-Modified-Since 的方式略有不同,但核心思想是一致的。需要注意的是,如果服务器上的资源被修改过,客户端仍需要下载新版本。