我在为以下情况制定HTTP缓存标头时遇到问题.
我们的服务器有大量数据,每周可能会改变几次.我希望浏览器缓存这些数据.此外,我希望尽可能减少条件获取的延迟,因为网络不可靠.
我追求的最终行为是这样的:
max-age(24小时).If-None-Match: [etag])304 Not Modified 归结为它的本能... 304响应可以包含一个新的max-age?或者原来是否max-age受到后续要求的尊重?
CXF JAXRS通过处理If-Match,If-Modified-Since和ETags标头提供对许多高级HTTP功能的支持.JAXRS请求上下文对象可用于检查前提条件.还支持Vary,CacheControl,Cookies和Set-Cookies.
我真的很想使用(或至少探索)这些功能.然而,虽然"提供支持"的声音非常有趣,但它在实现这些功能方面并不是特别有用.有关如何使用If-Modified-Since,CacheControl或ETags的任何帮助或指示?
我正在尝试在ASP.NET MVC Web API中设置缓存头,但IIS的响应表明正在忽略CacheControl值集.
我最初的假设是我在System.Web.Http.Cors中使用了EnableCorsAttribute,这在本用例中是必需的.但是,即使没有该属性,响应Cache-Control标头仍然是"私有".
我在这里做错了吗?
// GET api/<version>/content
// [EnableCors(origins: "*", headers: "*", methods: "*")]
public HttpResponseMessage Get(HttpRequestMessage request)
{
int cacheMaxAgeSeconds;
string cacheMaxAgeString = request.GetQueryString("cache-max-age") ?? request.GetQueryString("cache-max-age-seconds");
string rawUri = request.RequestUri.ToString();
try
{
cacheMaxAgeSeconds = cacheMaxAgeString == null ? Config.ApiCacheControlMaxSeconds : int.Parse(cacheMaxAgeString);
}
catch (Exception ex)
{
cacheMaxAgeSeconds = Config.ApiCacheControlMaxSeconds;
//...
}
try
{
//...
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent("...", Encoding.UTF8, "application/json")
};
response.Headers.CacheControl = new CacheControlHeaderValue
{
Public = true,
MaxAge = …Run Code Online (Sandbox Code Playgroud) 我目前使用Akamai作为CDN,但我注意到浏览器也在缓存内容.浏览器缓存images/css/js非常棒,但我想知道是否有一种方法可以不在浏览器上缓存,而是在Akamai中缓存.
现在,从我的起源开始,我发送这样的标题:
Cache-Control: public, must-revalidate, max-age=300
Expires: Sun, 19 Feb 2012 19:04:30 GMT
Date: Sun, 19 Feb 2012 18:59:30 GMT
Run Code Online (Sandbox Code Playgroud)
Akamai尊重这些标题,但也将它们传递给用户.这使得浏览器实际上也缓存了内容.
这在大多数情况下都很有用,但我们也有一些CDN逻辑,如果用户有登录的cookie,绕过CDN缓存并直接到源.
因此,如果让一个未经过验证的用户点击"登录",则会通过登录过程发送它们并返回到同一页面.即使CDN会从源页面请求此页面,浏览器实际上再次请求相同的页面,看起来好像登录没有工作.
现在,我可以强制登录过程添加一个查询参数,如?l = 1或者其他什么,但必须有更好的方法.
我很想知道Akamai是否可以将Cache-Control标头覆盖为硬编码的无缓存值,但我想知道是否有办法在源中执行此操作?
谢谢!
该gzip_proxied指令允许下列选项(非详尽):
如果响应头包含带有禁用缓存的值的"Expires"字段,则expired启用压缩;
如果响应头包含带有"no-cache"参数的"Cache-Control"字段,则no-cache启用压缩;
如果响应头包含带有"no-store"参数的"Cache-Control"字段,则no-store启用压缩;
如果响应头包含带有"private"参数的"Cache-Control"字段,则private启用压缩;
如果响应头不包含"Last-Modified"字段,则no_last_modified启用压缩;
如果响应头不包含"ETag"字段,则no_etag启用压缩;
如果请求标头包含"授权"字段,则auth启用压缩;
我看不出任何合理的理由来使用大多数这些选项.例如,为什么代理请求是否包含Authorization标题,或者Cache-Control: private影响我是否要gzip它?
鉴于Nginx的旧版本使用gzip压缩他们时,从响应中带ETag的,我可以看到一个用例no_etag:如果你没有Nginx的配置为您的gzip压缩响应的ETag,您可能希望通过对未压缩的响应与一个ETag而不是在没有ETag的情况下生成压缩的ETag.
但是,我无法弄明白其他人.
每个选项的预期用例是什么?
我目前正在开发REST服务.该服务具有不同版本的实体,类似于维基百科文章.
现在我想知道如果为了我应该返回什么
GET /article/4711
Run Code Online (Sandbox Code Playgroud)
我应该使用(临时)重定向到当前版本,例如
GET /article/4711/version/7
Run Code Online (Sandbox Code Playgroud)
或者我应该直接返回当前版本?使用重定向将大大简化HTTP缓存(使用Last-Modified),但具有重定向的缺点(额外请求,'更难'实现).因此,我不确定这是否是一种好的做法.
分享的任何建议,建议或经验?
(顺便说一下:曾经尝试过搜索"REST版本"?你得到的一切都是关于API的版本而不是实体.所以如果这是重复的话,请耐心等待.)
我的控制器中有一个方法,它使用send_data,如下所示:
def show
expires_in 10.hours, :public => true
send_data my_image_generator, :filename => "image.gif", :type => "image/gif"
end
Run Code Online (Sandbox Code Playgroud)
使用expires_in会导致标头像这样发送:
HTTP/1.1 200 OK
Connection: close
Date: Fri, 25 Jun 2010 10:41:22 GMT
ETag: "885d75258e9306c46a5dbfe3de44e581"
Content-Transfer-Encoding: binary
X-Runtime: 143
Content-Type: image/gif
Content-Disposition: inline; filename="image.gif"
Content-Length: 1277
Cache-Control: max-age=36000, public
Run Code Online (Sandbox Code Playgroud)
我想做的是添加一个标题,Expires: (some exact date)以防止用户代理重新验证.但我不知道如何让send_data设置那个标题?
我想我可以在response.headers哈希中明确地设置它,但肯定必须有一个包装器(或其他东西)?
我知道通常的做法是在css,javascript和图像文件的未来设置一个过期时间,然后通过附加查询字符串(或更改文件名)来确保所有浏览器在文件更改后立即获取最新内容
由此<link rel="stylesheet" type="text/css" href="base.css">:
对此:
<link rel="stylesheet" type="text/css" href="base.css?v=1234">
Run Code Online (Sandbox Code Playgroud)
要么:
<link rel="stylesheet" type="text/css" href="base_1234.css">
Run Code Online (Sandbox Code Playgroud)
但是在css文件中引用的图像呢?
// Inside base.css
background: url(/img/logo.png)
// Is this necessary(?):
background: url(/img/logo.png?v=1234)
Run Code Online (Sandbox Code Playgroud)
或者/img/logo.png当base.css将文件名更改为base.css?v=1234或base_1234.css自动时会重新加载?
而且,怎么样在图像src的img标签都有效?
我想知道是否有办法检测何时从本地缓存返回响应?可能吗?
解决方案应该是通用的,适用于无条件请求.在这种情况下,响应代码始终为200 OK,但XHR返回第二个请求的缓存资源(例如,第一个响应包含Expires头,因此无需在到期日期之前向服务器请求新资源).
http-caching ×10
http ×3
http-headers ×3
caching ×2
rest ×2
.net-core ×1
ajax ×1
akamai ×1
asp.net-core ×1
c# ×1
cdn ×1
conditional ×1
cxf ×1
gzip ×1
java ×1
jax-rs ×1
nginx ×1