我正在尝试向我的 REST API 发出请求,我对 Firefox 没有任何问题,但在 Chrome 中我无法让浏览器工作,总是抛出
200 OK
,因为没有 if-none-match
(或类似的)标头发送到服务器。
使用 Firefox,我得到了完美的
304
。
我想我错过了一些东西,我尝试用
Cache-Control: max-age=10
进行测试,但什么也没有。
Chrome 可能无法发送
If-None-Match
的一个原因是响应包含“HTTP/1.0”而不是“HTTP/1.1”状态行。某些服务器(例如 Django 的开发服务器)会发送较旧的标头(可能是因为它们不支持 keep-alive),当它们这样做时,ETag 在 Chrome 中不起作用。
在“响应标头”部分中,单击“查看源代码”而不是已解析的版本。第一行可能会读到类似
HTTP/1.1 200 OK
的内容 - 如果它显示 HTTP/1.0 200 OK
Chrome 似乎会忽略任何 ETag
标头,并且不会在下次加载此资源时使用它。
也可能有其他原因(例如,确保您的 ETag 标头值在引号内发送),但就我而言,我消除了所有其他变量,这才是重要的。
更新:看看你的屏幕截图,看来这也正是你的情况(来自Python的HTTP/1.0服务器)!
假设您使用的是 Django,请将以下 hack 放入本地设置文件中,否则您必须在您和
./manage.py runserver
守护进程之间添加实际的 HTTP/1.1 代理。此解决方法monkey 修补 Django 内部使用的关键 WSGI 类,使其发送更有用的状态行:
# HACK: without HTTP/1.1, Chrome ignores certain cache headers during development!
# see https://stackoverflow.com/a/28033770/179583 for a bit more discussion.
from wsgiref import simple_server
simple_server.ServerHandler.http_version = "1.1"
还要检查浏览器中的缓存是否未禁用,就像开发网站时经常这样做的那样,以便您始终看到最新的内容。
我在 Chrome 中遇到了类似的问题,我使用
http://localhost:9000
进行开发(没有使用 If-None-Match
)。
通过切换到
http://127.0.0.1:9000
Chrome1 自动开始再次在请求中发送 If-None-Match
标头。
此外 - 确保未选中
Devtools > Network > Disable Cache [ ]
。
1 我找不到任何有记录的地方 - 我假设 Chrome 负责这个逻辑。
Chrome 未发送适当的标头(
If-Modified-Since
和 If-None-Match
),因为未设置缓存控制,从而强制 default
(这就是您所遇到的情况)。在此处阅读有关缓存选项的更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Request/cache。
Cache-Control: no-cache
header 在服务器上获得所需的行为;或在浏览器/客户端上通过 Request.cache = 'no-cache'
选项。
Chrome 也没有为我发送“If-None-Match”标头。我没有任何缓存控制标头。我关闭了浏览器,再次打开它,它开始按预期发送“If-None-Match”标头。因此,重新启动浏览器是检查您是否遇到此类问题的另一种选择。
If-Modified-Since
和
If-None-Match:
标头。只有那些通过标签链接的,才会添加这些标题。