我正在使用MSXML的XmlHttpRequest对象发出请求:
IXMLHttpRequest http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.send();
Run Code Online (Sandbox Code Playgroud)
并且send成功了,我得到了我的xml数据.
除了XmlHttpRequest实际上没有打网络(我可以看到没有发出实际的http请求).并且Process Monitor显示文件实际上是从我的缓存中提供的:

所以我想指示XmlHttpRequest用户代理任何超过0秒的缓存内容都太旧了.执行此操作的标准方法是添加请求标头:
Cache-Control: max-age=0
Run Code Online (Sandbox Code Playgroud)
发送请求:
http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();
Run Code Online (Sandbox Code Playgroud)
并且send成功了,我得到了我的xml数据.
除了XmlHttpRequest实际上没有打网络(我可以看到没有发出实际的http请求).Process Monitor显示文件实际上是从我的缓存中提供的.
那有什么不对?是max-age不是在做什么我想它呢?
来自RFC 2616 - 超文本传输协议,第14部分:标题字段定义:
其他指令允许用户代理修改基本过期机制.可以在请求中指定这些指令:
max-age
表示客户端愿意接受年龄不大于指定时间(秒)的响应.除非还包括最大指令,否则客户不愿意接受陈旧的响应.
这正是我想要的.
是Cache-Control: max-age=0不是我想要的,或者是MSXML的XmlHttpRequest对象错误?
这是MSXML XmlHttpRequestCOM对象:
该max-age指令由客户端添加,以供所有要遵守的缓存使用.来自RFC:
Cache-Control通用头字段用于指定请求/响应链中的所有缓存机制必须遵守的指令 …
我们正在将网站从一个CMS迁移到另一个CMS..htaccess文件已更改,需要刷新才能使新站点正常工作.根据我的理解,如果浏览器缓存被清除,.htaccess文件将只刷新?创建网站的人可以清除我们的缓存,但有没有办法让用户的浏览器获得新的.htaccess文件,而无需用户自己手动清除缓存?
如何在JSP中添加Expires或Cache-Control标头?我想在包含页面中为我的静态组件添加远期到期日期,例如图像,CSS和JavaScript文件.
我试图确保某个页面永远不会被缓存,并且在用户单击后退按钮时从不显示. 这个非常高评价的答案(目前1068支票)说使用:
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
Run Code Online (Sandbox Code Playgroud)
但是在IIS7/ASP.NET MVC中,当我发送这些头时,客户端会看到这些响应头:
Cache-control: private, s-maxage=0 // that's not what I set them to
Pragma: no-cache
Expires: 0
Run Code Online (Sandbox Code Playgroud)
缓存控制头怎么了?IIS7或ASP.NET本机的内容是否会覆盖它?我检查了我的解决方案,我没有覆盖此标头的代码.
当我Response.Headers.Remove("Cache-Control");首先添加时,它没有任何区别:
Response.Headers.Remove("Cache-Control");
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
Run Code Online (Sandbox Code Playgroud)
当我添加一个[OutputCache]属性时:
[OutputCache(Location = OutputCacheLocation.None)]
public ActionResult DoSomething()
{
Response.Headers.Remove("Cache-Control");
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
var model = DoSomething();
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
然后客户端响应标头更改为:
Cache-control: no-cache
Pragma: no-cache
Expires: 0
Run Code Online (Sandbox Code Playgroud)
哪个更接近,但仍然不是我要发送的标题.这些标题在哪里被覆盖,我该如何阻止它?
编辑:我已经检查过,错误的标题被发送到Chrome,FF,IE和Safari,所以它看起来是一个服务器问题,而不是浏览器相关的问题.
我在我的Nginx中有一个配置如下的资源:
location ~ foo\.js$ {
add_header Cache-Control public;
expires 1d;
}
Run Code Online (Sandbox Code Playgroud)
如果我用Firebug打开它并查看标题,它会显示:
Cache-Control max-age=86400, public
Run Code Online (Sandbox Code Playgroud)
该网站正在使用HTTPS,所以我想确保我做对了,因为显然浏览器不会缓存它,除非它的max-age> 0 AND public.看到这个
但是当我使用Nginx时会发生什么curl -Ik https://...,它说:
...
Expires: Sat, 22 Jan 2011 18:23:36 GMT
Cache-Control: max-age=86400
Cache-Control: public
...
Run Code Online (Sandbox Code Playgroud)
它重复Cache-Control标题!萤火虫显然不介意.但这是对的吗?
是否有一种更好的方法来设置Expires和Cache-Control(public仅)两行?
当我使用 Chrome 测试缓存处理中的奇怪行为时(我在这里询问了一些相关问题),我发现了一些其他内容:当服务器返回 304 响应时,Chrome 开发工具会显示 200 状态代码。
在这里您可以看到 chrome 开发工具所说的内容 (200),我包含了一个显示服务器 304 响应的wireshark 捕获。
下面是 Firefox 的相同用法,其中显示了 304 代码:
更有趣的是两个浏览器之间的时间差异:
Firefox 没有显示接收部分的延迟,但 Chrome 表示花了 3.91 毫秒。
您知道 Chrome 为何不显示正确的状态代码吗?
如果你想自己测试一下,这里是服务器代码:
#!/usr/bin/env node
'use strict';
const express = require('express');
const cors = require('cors');
const compression = require('compression');
const pathUtils = require('path');
const fs = require('fs');
const http = require('http');
let app = express();
app.disable('x-powered-by');
app.use(express.json({ limit: '50mb' }));
app.use(cors());
app.use(compression({}));
app.use(function (req, res, next) {
res.set('Cache-control', 'no-cache');
console.log(req.headers); …Run Code Online (Sandbox Code Playgroud) 截至最近的safari 5已经发布,结果导致我的网站出现了一些问题.我有一个运行经典ASP的动态网站(虽然这应该不重要),并且该网站对历史堆栈有一些创造性的使用.例如,您可以在列出产品的页面上,然后转到有关产品的详细信息并更改产品(admin-view).单击产品上的"保存"时,信息将通过AJAX发送到服务器,并history.back()发出a.这适用于所有浏览器(包括safari <= 4),但是,在新发布的Safari 5中它停止工作.似乎当您在safari 5中单击它实际上并不刷新页面时,它只会从缓存中加载它,这意味着不会显示在详细信息视图中所做的更改.我怎样才能在safari 5中进行这项工作呢?这是我必须关闭缓存的当前代码(包含在每个页面的顶部):
Dim pStr
pStr = "private, no-cache, no-store, must-revalidate"
Response.AddHeader "pragma","no-cache" '?
Response.AddHeader "cache-control", pStr '? Er ikke sikker på om disse 3 siste er nødvendige.
Response.AddHeader "cache-control", "post-check=0, pre-check=0" '? Er ikke sikker på om disse 3 siste er nødvendige.
Response.AddHeader "Expires", "Mon, 26 Jul 1997 05:00:00 GMT" '?
Response.AddHeader "Last-Modified", Now()
Run Code Online (Sandbox Code Playgroud) 如何Cache-Control在Spring Boot中为静态资源添加HTTP头?
尝试在应用程序中使用过滤器组件,它正确地写入标头,但Cache-Control标头被覆盖.
@Component
public class CacheBustingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpResp = (HttpServletResponse) resp;
httpResp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
httpResp.setHeader("This-Header-Is-Set", "no-cache, no-store, must-revalidate");
httpResp.setHeader("Expires", "0");
chain.doFilter(req, resp);
}
Run Code Online (Sandbox Code Playgroud)
我在浏览器中得到的是:
Cache-Control:no-store
This-Header-Is-Set:no-cache, no-store, must-revalidate
Expires:0
Run Code Online (Sandbox Code Playgroud)
我想要的是:
Cache-Control:no-cache, no-store, must-revalidate
This-Header-Is-Set:no-cache, no-store, must-revalidate
Expires:0
Run Code Online (Sandbox Code Playgroud) 我知道这是一个简单的问题,我相信没有任何机构会将此标记为重复的问题,因为我已经搜索了所有的SO.所以我的问题是Http的Cache控制机制中max-age和max-stale之间的区别是什么,我在这里读过它,但我感觉它有点复杂,所以如果有人能解释一下这个吗?这将是很大的帮助
我在firebase上托管SPA,几乎所有路径都被重写index.html.我正在使用基于webpack hash的缓存清除,所以我想总是阻止缓存我的index.html而不是任何其他文件.我发现这样做非常困难.具体来说,我的文件布局如下所示
/
??? index.html
??? login.html
??? js
? ??? login.ba22ef2579d744b26c65.bundle.js
? ??? main.6d0ef60e45ae7a11063c.bundle.js
??? public
??? favicon-16x16.ico
Run Code Online (Sandbox Code Playgroud)
"sources": "index.html"在从文档中读到这个引用之前,我开始天真.
无论使用glob表示法的任何重写规则如何,每个定义都必须具有与原始请求路径匹配的源键.
好的,所以不是一个简单的glob指定我想要这些头文件的文件,我想我需要一个路径.由于大多数路径重定向到index.html,我需要一个glob,它排除了我不想放置这些头的所有路径.
作为参考,我的firebase.json托管部分如下所示:
{
"hosting": {
"public": "dist",
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
],
"cleanUrls": true,
"trailingSlash": false,
"headers": [
{
"source": <<<WHAT-GOES-HERE?>>>,
"headers": [
{
"key": "Cache-Control",
"value": "no-cache, no-store, must-revalidate"
},
{
"key": "Pragma",
"value": "no-cache"
},
{
"key": "Expires",
"value": "0"
}
]
} …Run Code Online (Sandbox Code Playgroud) cache-control firebase single-page-application firebase-hosting
cache-control ×10
http ×3
java ×2
.htaccess ×1
asp.net-mvc ×1
c# ×1
caching ×1
firebase ×1
http-headers ×1
iis-7 ×1
jsp ×1
msxml ×1
nginx ×1
safari ×1
spring-boot ×1