我发回一个带有以下HTTP响应头的图像:
Cache-Control: private,max-age=86400
Run Code Online (Sandbox Code Playgroud)
我的理解是浏览器甚至不应该在24小时内询问此文件(86,400 = 60s*60m*24h).
我在后续请求中看到的是它仍然要求该文件,但返回"304 Not Modified".这很好,但我想删除该请求/响应.
需要什么标头来防止浏览器甚至费心去询问文件,只是让它盲目地使用它在本地缓存中的文件,直到该文件到期为止?
我对这个标题感到Cache-Control:must-revalidate困惑,我已经读过,在提供缓存项目之前,有必要使用源验证所有请求,但只是陈旧的?或者无论陈旧还是新鲜?我在不同的地方读过这两件事.
有什么区别Cache-Control:no-cache?因为这些标题看起来与我相同.
更新1:我从一本书中读到了这个:
的
Cache-Control: must-revalidate响应报头告诉缓存绕过新鲜度计算机构和重新验证在每次访问:
@Peter O.指出了RFC所说的内容.所以那本旧书是错的.
更新2:在本教程中:http://www.mnot.net/cache_docs/
no-cache- 强制缓存每次在释放缓存副本之前将请求提交到源服务器进行验证.这有助于确保认证(与公众结合),或保持严格的新鲜度,而不会牺牲缓存的所有好处.
must-revalidate- 告诉缓存他们必须遵守你给他们的关于表示的任何新鲜度信息.HTTP允许缓存在特殊条件下提供陈旧的表示; 通过指定此标头,您告诉缓存您希望它严格遵循您的规则.
我正在研究在WCF上实现的HTTP REST服务.我想适当地为我的操作设置HTTP缓存控制头.
我已经看到一些涉及使用WebOperationContext.Current.OutgoingResponse修改每个方法中的标头的示例.但是说实话,这是一个痛苦的屁股,特别是因为几乎所有的操作都将使用相同的缓存控制策略(无缓存).
我认为必须有一种优雅的方式来设置它.也许ServiceBehavior的组合可以设置服务级别的默认值,而OperationBehaviors可以覆盖某些操作的默认值?或者也许有更好的方法来做到这一点?
我们正尝试在Azure CDN上通过ETag 启用HTTP压缩(gzip)和HTTP 304缓存.我们已经发现启用Azure CDN压缩的问题,但现在我们无法同时使用压缩和ETag缓存(304s).此问题已在此处发布到Azure论坛.
https://xxxx.vo.msecnd.net/resourceManager.axd?token=HL80vX5hf3lIAAA&group=core.js
https://xxxx.vo.msecnd.net/resourceManager.axd?token=HL80vX5hf3lIAAA&group=core.png
有谁知道如何在Azure CDN上一起使用HTTP缓存(304s)和HTTP压缩?
http-compression azure http-caching azure-web-roles azure-cdn
我正在通过设备使用诸如varnish-devicedetect之类的东西来对用户代理进行分支,并将结果存储X-UA-Device在请求和响应中.
我已经看到了一些因用户代理而异的建议.有什么理由不改变X-UA-Device吗?看起来它对下游缓存更好.
我在我的网站上使用Youtube(v3)API,其中显示了许多YouTube视频缩略图.例如:https://i1.ytimg.com/vi/0ZL_q7oUVrQ/mqdefault.jpg
当我查看我的网站的Google Insights(https://developers.google.com/speed/pagespeed/insights/)时,它会抱怨"利用浏览器缓存"错误.我已经注意到添加了来自我的服务器的静态资源的到期日期,例如js/css文件,但Google的见解主要是抱怨外部直接来自Youtube服务器的缩略图.
我的网站有很多,这些缩略图和缓存它们是非常重要的,快速的页面加载但YouTube的服务器已经为只有6个小时的到期时间,我没有找到一个方法来改变,因为他们是外部到我的服务器.
我非常感谢有人可以建议我更好地处理浏览器缓存,因为资源来自外部服务器(例如来自youtube服务器的缩略图)我很惊讶Youtube只设置了到期时间6小时虽然图像是经常更换的最不可能的资源......!
youtube-api http-caching browser-cache pagespeed youtube-javascript-api
我正在构建REST API,在特定区域返回数据(比如说事件).REST URL是一个简单的GET
/api/v1/events?lat=<lat>&lng=<lng>&radius=<radius>.
Run Code Online (Sandbox Code Playgroud)
与参数lat,lng和radius(10英里默认情况下),纬度和经度是设备或浏览器的API什么回报.现在不用说,lat和lng随着用户移动而连续变化,并且两个用户可以是相同的附近,具有不同的lat/lng.在服务器上缓存此类请求的最佳方法是什么,这样我就不必每次都进入业务逻辑.自lat/lng更改后,URL不会是唯一的.
谢谢
我正在尝试测试一些缓存配置,我希望我的页面在请求再次到达服务器之前保留在缓存中1分钟.
使用这个简单的test.asp页面,它有一个自己的链接:
<% Option Explicit %>
<%
Response.Expires = 1
Response.CacheControl = "private, max-age=60"
%>
<html>
<head><title>test</title></head>
<body>
<% =Now() %>
<br />
<a href="test.asp">test</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这在我的开发计算机http://localhost/test.asp上完美运行,(点击链接不会在1分钟内刷新打印的日期时间).
但是,当我将页面放在生产服务器上时,它没有达到预期的效果.点击链接仅几秒钟后,我得到一个新的日期时间,意味着请求到达了Web服务器.
我使用Chrome开发工具查看这些响应标头:
HTTP/1.1 200 OK
Cache-Control: private, max-age=60
Content-Type: text/html
Expires: Tue, 12 May 2015 19:16:52 GMT
Last-Modified: Tue, 12 May 2015 19:10:00 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Tue, 12 May 2015 19:15:55 GMT
Content-Length: 205
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助解释为什么它不能在prod服务器上工作?
更新 我尝试使用Chrome,Firefox和IE,还有2个页面test.asp和test2.asp,两个都有一个指向另一个页面的链接,并且在8-12秒之后得到完全相同的问题,页面刷新而不是等待刷新前60秒.
我有一个连接到外部第三方API的应用程序,最近API的测试实例并不是特别可靠.这会停止开发进度并将我们的构建管道变为红色,所以我想添加一个HTTP记录代理来阻止这种情况发生.
我已经推荐了WireMock,并且尝试过它的记录和播放功能,它看起来确实非常好 - 它开箱即用.我们只需更改外部服务的配置URL,然后记录如下:
java -jar wiremock-standalone-2.3.1.jar \
--port 8080 \
--proxy-all="https://test-api.example.com/" \
--record-mappings \
--verbose
Run Code Online (Sandbox Code Playgroud)
这会在当前工作目录中创建缓存文件夹,然后可以通过终止录制器并切换到播放来切换到播放模式:
java -jar wiremock-standalone-2.3.1.jar \
--port 8080 \
--verbose
Run Code Online (Sandbox Code Playgroud)
但是,要在实践中使用它,我需要设置一个运行测试回归包的应用程序实例来记录大量的API使用情况,然后每天说一次.然后,我需要停止录制器并将缓存文件复制到播放过程,然后重新开始播放过程.
这可能会起作用,但感觉就像很多活动部件,理想情况下我想同时进行游戏和录音.如果需要新的API调用(由于自然的项目更改),这将允许自动刷新缓存,但默认情况下将在找到匹配项时进行回放.
这可能吗?我不是Java程序员,但假设如果要编写WireMock插件,它可能是可用的.如果可以在控制台上完成这将是很好的,但是手册的措辞表明播放和记录被维护者认为是单独的事情.
我确实想知道我是否可以切换到Mountebank,看起来它可能会支持这一点,但事实证明,播放和记录在这里也是单独的模式.在任何情况下,我都喜欢WireMock的开始是多么容易,所以如果可能的话,我想坚持下去.
考虑一下这view会生成ico图像:
from django.http import HttpResponse
from app.somewhere import Favicon
# View URL: `/<str:colour>.ico`
def favicon( request, colour ):
response = HttpResponse(
Favicon.render( colour ),
status=200
)
response['Content-Type'] = 'image/x-icon'
response['Cache-Control'] = 'public, max-age=31536000'
return response
Run Code Online (Sandbox Code Playgroud)
Favicon.render() 返回一个有效的字节流,对此不用理会。
这是我的HTML文档中的link元素head:
<link rel=icon href=/7f9fa4.ico>
Run Code Online (Sandbox Code Playgroud)
现在出现了一个问题:为什么每次我重新加载页面时,浏览器Chromium 73都会向发送请求/7f9fa4.ico,而不是从缓存中检索图标?如果我将/7f9fa4.ico在新标签页中打开,则将首次向服务器发送请求,然后我的浏览器将从缓存中检索图像;现在告诉我浏览器缓存系统出了什么问题。
这是一个请求(忽略cookie和首选项):
GET /7f9fa4.ico HTTP/1.1
Host: localhost:8000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) …Run Code Online (Sandbox Code Playgroud) http-caching ×10
caching ×4
http ×4
rest ×2
asp-classic ×1
asp.net ×1
azure ×1
azure-cdn ×1
django ×1
geolocation ×1
java ×1
location ×1
pagespeed ×1
varnish ×1
wcf ×1
wiremock ×1
youtube-api ×1