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:您是否在 Chrome Disable 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-SinceIf-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”标头

浏览器未发送 If-None-Match 标头

Chrome 会忽略 ETag 标头,只使用内存缓存/磁盘缓存

HTTP之一 If-Modified-Since & If-None-Match

If-None-Match 没有在我的请求中通过

Last-Modified If-Modified-Since ETag If-None-Match