Chrome没有发送if-none-match

时间:2014-03-29 16:51:47

标签: google-chrome firefox caching xmlhttprequest etag

我尝试向我的REST API发出请求,我对Firefox没有任何问题,但在Chrome中我无法使浏览器正常工作,因此总是抛出200 OK,因为没有{ {1}}(或类似的)标头被发送到服务器。

Chrome request

使用Firefox,我完全得到if-none-match

Firefox request

我想我错过了一些东西,我尝试用304来测试但没有。

5 个答案:

答案 0 :(得分:15)

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 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-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