Chrome 不发送 if-none-match

问题描述 投票:0回答:6

我正在尝试向我的 REST API 发出请求,我对 Firefox 没有任何问题,但在 Chrome 中我无法让浏览器工作,总是抛出

200 OK
,因为没有
if-none-match
(或类似的)标头发送到服务器。

Chrome request

使用 Firefox,我得到了完美的

304

Firefox request

我想我错过了一些东西,我尝试用

Cache-Control: max-age=10
进行测试,但什么也没有。

google-chrome firefox caching xmlhttprequest etag
6个回答
21
投票

Chrome 可能无法发送

If-None-Match
的一个原因是响应包含“HTTP/1.0”而不是“HTTP/1.1”状态行。某些服务器(例如 Django 的开发服务器)会发送较旧的标头(可能是因为它们不支持 keep-alive),当它们这样做时,ETag 在 Chrome 中不起作用。

Sample HTTP/1.0 server response source

在“响应标头”部分中,单击“查看源代码”而不是已解析的版本。第一行可能会读到类似

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"

16
投票

还要检查浏览器中的缓存是否未禁用,就像开发网站时经常这样做的那样,以便您始终看到最新的内容。


6
投票

我在 Chrome 中遇到了类似的问题,我使用

http://localhost:9000
进行开发(没有使用
If-None-Match
)。

通过切换到

http://127.0.0.1:9000
Chrome1 自动开始再次在请求中发送
If-None-Match
标头。

此外 - 确保未选中

Devtools > Network > Disable Cache [ ]

1 我找不到任何有记录的地方 - 我假设 Chrome 负责这个逻辑。


2
投票

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'
选项


0
投票

Chrome 也没有为我发送“If-None-Match”标头。我没有任何缓存控制标头。我关闭了浏览器,再次打开它,它开始按预期发送“If-None-Match”标头。因此,重新启动浏览器是检查您是否遇到此类问题的另一种选择。


0
投票
如果使用 xmlHttpRequest 或 jQuery ajax 方法通过另一个脚本下载脚本/文件,Chrome 也不会发送

If-Modified-Since

If-None-Match:
 标头。

只有那些通过标签链接的,才会添加这些标题。

© www.soinside.com 2019 - 2024. All rights reserved.