Chrome 没有发送 if-none-match
Posted
技术标签:
【中文标题】Chrome 没有发送 if-none-match【英文标题】:Chrome is not sending if-none-match 【发布时间】:2014-05-09 03:48:43 【问题描述】:我正在尝试向我的 REST API 发出请求,我对 Firefox 没有任何问题,但在 Chrome 中我无法让浏览器工作,总是抛出 200 OK
,因为没有 if-none-match
(或类似的)标头被发送到服务器。
使用 Firefox,我可以完美地得到 304
。
我想我错过了什么,我尝试使用Cache-Control: max-age=10
进行测试,但没有。
【问题讨论】:
您可以发布您发送请求的代码吗?你是在使用 vanilla js 还是某个库? 代码是否相关?由 angularjs 制成 @avances123:您是否在 ChromeDisable cache(while DevTools in open)
中启用了选项?
不,我已经尝试了***中的所有内容......
我迁移到了 Restangular,它具有内置的 etag 支持,但是什么也没有,chrome 不发送任何条件请求标头...
【参考方案1】:
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 patches Django 内部使用的关键 WSGI 类,以使其发送更有用的状态行:
# HACK: without HTTP/1.1, Chrome ignores certain cache headers during development!
# see https://***.com/a/28033770/179583 for a bit more discussion.
from wsgiref import simple_server
simple_server.ServerHandler.http_version = "1.1"
【讨论】:
谢谢你!我正在使用 Django Dev Server,我遇到了同样的问题。 @natevw,我面临同样的问题。问题是当我刷新选项卡时,在请求标头中看不到 if-none-match。但是当我提出另一个 ajax 请求时,我可以看到它。可能是什么问题? @VibhavSinghRohilla 这听起来不像是同一个问题。也许您的浏览器只是在刷新时不使用缓存来提供帮助?也许您可以提出自己的问题并提供更多详细信息。 @natevw - 我的问题链接是 - ***.com/questions/39845674/…【参考方案2】:还要检查浏览器中的缓存是否未禁用,开发网站时经常这样做,以便您始终看到最新的内容。
【讨论】:
我花了 30 分钟调查这个问题 - 现在我觉得自己很愚蠢 哇,这也是我的问题!打开开发工具后,缓存被禁用,因此不会发送“if-none-match”(Firefox)。 about:config , browser.cache.memory.enable 在我的 Firefox 中被禁用 如何检查这个【参考方案3】:Chrome 也没有为我发送“If-None-Match”标头。我没有任何缓存控制标头。我关闭了浏览器,再次打开它,它开始按预期发送“If-None-Match”标头。因此,重新启动浏览器是检查您是否遇到此类问题的另一种选择。
【讨论】:
【参考方案4】:我在 Chrome 中遇到了类似的问题,我使用 http://localhost:9000
进行开发(没有使用 If-None-Match
)。
通过切换到http://127.0.0.1:9000
Chrome1 自动开始再次在请求中发送If-None-Match
标头。
另外 - 确保 Devtools > Network > Disable Cache [ ]
未选中。
1 我在任何地方都找不到此记录 - 我假设 Chrome 负责此逻辑。
【讨论】:
Devtools > Network > Disable Cache
拯救了我的一天。谢谢!
使用最新的 Chrome 88.0.4324.104 有时我仍然看到 Chrome 没有发送“If-None-Match”【参考方案5】:
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'
option在浏览器/客户端上。
【讨论】:
以上是关于Chrome 没有发送 if-none-match的主要内容,如果未能解决你的问题,请参考以下文章
Safari 不发送“If-Modified-Since”和“If-None-Match”标头
Chrome 会忽略 ETag 标头,只使用内存缓存/磁盘缓存