如果服务器返回,http客户端应该怎么做Cache-Control: private, public?
我有一种感觉private应该覆盖public,但我无法在RFC中找到确认(除了MUSTin private和MAYin public).
我们有几个文件通过HTTP提供,并且不时更改.
哪些是与缓存相关的HTTP标头,我们应该在HTTP响应中返回以优化浏览器加载速度,同时强制浏览器验证它是否具有文件的最新版本?
我们已经设置了一个"Expires"标题,其中包含过去的日期(此时似乎已达成共识).
但是有些人建议设置这个标题:
Cache-Control: no-cache, no-store, must-revalidate
Run Code Online (Sandbox Code Playgroud)
但是这个标题的问题在于它阻止浏览器保留文件的本地副本,因此每次使用200响应代码下载文件,即使它没有更改.
如果我只是使用:
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)
然后浏览器(至少Firefox 14和Chrome 20)保留本地副本,发送If-Modified-Since和If-None-Match标题,服务器返回304代码并且不下载文件内容. 这是可以随时更改的这些文件的最佳行为.
问题是我不知道设置"no-cache"是否足以强制所有浏览器(包括旧的但仍然使用的版本)和代理服务器使用服务器重新验证其本地缓存副本.
最后,Pragma: no-cache标题怎么样?它应该也包含在HTTP响应中吗?
我有这个代码:
context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.Public);
context.HttpContext.Response.Cache.SetMaxAge(TimeSpan.FromHours(24));
Run Code Online (Sandbox Code Playgroud)
响应如下:
Status Code: 200
Date: Fri, 14 Dec 2012 13:56:41 GMT
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Content-Length: 38436
X-AspNetMvc-Version: 4.0
Server: Microsoft-IIS/8.0
Content-Type: application/rss+xml; charset=utf-8
Cache-Control: public
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcVGVzdFxtYW5nb21pbnQucHVibGljXHNyY1xNYW5nb21pbnQuUHVibGljLldlYlxibG9nXHJzcw==?=
Run Code Online (Sandbox Code Playgroud)
为什么Cache-Control上没有定义max-age?
在nginx中使用add_header指令时,标头将添加到来自源服务器的响应中.
假设源服务器返回cache-control public,max-age = 60.但是在nginx反向代理位置,您可以设置如下:
add_header cache-control public,max-age = 10
这究竟是做什么的?我可以想到两种不同的场景:
1)Nginx尊重来自源服务器的缓存控制头,并将内容存储在其缓存中,有效期为60秒.然后使用覆盖的标头传递响应,导致客户端将资源存储在其缓存中,到期时间为10秒.
要么..
2)Nginx首先覆盖响应头,然后解释它们.它以10秒的有效期存储资源,并将响应传递给客户端,客户端也将其缓存,有效期为10秒.
我有一个从 CDN 提供的大部分静态 HTML 网站(加上一些 AJAX 到服务器),并且确实希望用户的浏览器缓存所有内容,直到我更新任何文件然后我希望用户的浏览器获得新版本。
对于我网站上的所有类型的静态文件(HTML、JS、CSS、图像等),我该如何实现?(HTML 或其他地方的设置)。显然我可以告诉 CDN 让它的缓存过期,所以它是我正在考虑的客户端。
谢谢。
我有以下配置来运行 angular.js 应用程序,它工作正常。
location / {
root /usr/share/nginx/html;
index index.html;
expires -1;
add_header Pragma "no-cache";
add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
try_files $uri $uri/ /index.html =404;
}
Run Code Online (Sandbox Code Playgroud)
但是当我添加缓存时
location ~* \.(jpg|jpeg|png|gif|swf|svg|ico|mp4|eot|ttf|otf|woff|woff2|css|js)$ {
add_header Cache-Control "max-age=86400, must-revalidate, s-maxage=2592000";
}
Run Code Online (Sandbox Code Playgroud)
文件不再可访问
[error] 5#5: *1 open() "/etc/nginx/html/scripts/vendor-1568b32f3e.js" failed (2: No such file or directory), client: 87.63.75.163, server: localhost, request: "GET /scripts/vendor-1568b32f3e.js HTTP/1.1", host: "myapp", referrer: "http://myapp/auth/login"
Run Code Online (Sandbox Code Playgroud)
不知道为什么/etc/nginx/html/在根路径为/usr/share/nginx/html
考虑下面的一段代码,它获取一个 RSS 提要,然后将其中的图像显示为永远循环的幻灯片:
import QtQuick 2.2
import QtQuick.XmlListModel 2.0
Rectangle {
id: window
color: "black"
width: 800
height: 480
PathView {
anchors.fill: parent
highlightRangeMode: PathView.StrictlyEnforceRange
preferredHighlightBegin: 0.5
preferredHighlightEnd: 0.5
highlightMoveDuration: 500
snapMode: PathView.SnapOneItem
pathItemCount: 3 // only show previous, current, next
path: Path { // horizontal
startX: -width; startY: height/2
PathLine{x: width*2; y: height/2}
}
model: XmlListModel {
source: "http://feeds.bbci.co.uk/news/business/rss.xml"
query: "/rss/channel/item"
namespaceDeclarations: "declare namespace media = 'http://search.yahoo.com/mrss/';"
XmlRole { name: "image"; query: "media:thumbnail/@url/string()" }
}
delegate: Image {
width: …Run Code Online (Sandbox Code Playgroud) 我正在使用Glide库进行图像加载.我的应用程序中有很多图像,所以我想在缓存大小超过50 MB时清除缓存.有人可以帮我这样做吗?
是否可以仅对图像,字体,css和js等静态资产进行缓存控制?
这是我的解决方法
[[headers]]
for = "/*" # This defines which paths this specific [[headers]] block will cover.
[headers.values]
Cache-Control = "public, max-age=604800"
Run Code Online (Sandbox Code Playgroud)
它很可爱,但是效果不如我预期。即使更新内容,该网站似乎仍使用旧版本。
我正在为 Gatsby 设置 Nginx 服务器(版本 1.17.1),以遵循https://www.gatsbyjs.org/docs/caching/上的建议。
下面的片段是我的server {}块尝试实现推荐的缓存配置的部分;
location ~* \.(?:html)$ {
add_header Cache-Control "public, max-age=0, must-revalidate";
}
location /static {
add_header Cache-Control "public, max-age=31536000, immutable";
}
location ~* \.(?:css|js)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
location /sw\.js {
add_header Cache-Control "public, max-age=0, must-revalidate";
}
Run Code Online (Sandbox Code Playgroud)
同样尝试使用if 语句代替location {}为 service worker 文件定义缓存配置的块sw.js,如下所示;
if ($request_uri ~ ^sw\.(?:js)$) {
set $no_cache 1;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,除了sw.js.
我在做什么错了,我怎么能解决这个问题,从而有效一套高速缓存控制报头sw.js到public, max-age=0, must-revalidate …
cache-control ×10
nginx ×3
caching ×2
http ×2
http-headers ×2
.net ×1
android ×1
angularjs ×1
asp.net ×1
asp.net-mvc ×1
gatsby ×1
html ×1
http-caching ×1
javascript ×1
netlify ×1
no-cache ×1
qml ×1
qt ×1
qtquick2 ×1
rfc2616 ×1