我尝试向我的REST API发出请求,我对Firefox没有任何问题,但在Chrome中我无法使浏览器正常工作,因此总是抛出200 OK
,因为没有{ {1}}(或类似的)标头被发送到服务器。
使用Firefox,我完全得到if-none-match
。
我想我错过了一些东西,我尝试用304
来测试但没有。
答案 0 :(得分:15)
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://stackoverflow.com/a/28033770/179583 for a bit more discussion.
from wsgiref import simple_server
simple_server.ServerHandler.http_version = "1.1"
答案 1 :(得分:12)
同时检查浏览器中是否未禁用缓存,这在开发网站时经常进行,因此您始终可以看到最新内容。
答案 2 :(得分:1)
我在Chrome中遇到了类似的问题,我使用http://localhost:9000
进行开发(未使用If-None-Match
)。
通过切换到http://127.0.0.1:9000
Chrome 1 ,自动开始再次在请求中发送If-None-Match
标头。
此外-确保未选中Devtools > Network > Disable Cache [ ]
。
1 我在文档中找不到任何地方-我假设Chrome对此逻辑负责。
答案 3 :(得分:0)
Chrome未发送' If-None-Match'我也是头。我没有任何缓存控制标头。我关闭了浏览器,再次打开它,它开始发送“如果 - 无匹配”#39;标头符合预期。因此,重新启动浏览器是检查是否存在此类问题的另一种选择。
答案 4 :(得分:0)
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。