标签: http-caching

HTTP:结合过期和验证缓存

我在为以下情况制定HTTP缓存标头时遇到问题.

我们的服务器有大量数据,每周可能会改变几次.我希望浏览器缓存这些数据.此外,我希望尽可能减少条件获取的延迟,因为网络不可靠.

我追求的最终行为是这样的:

  1. 客户端请求之前从未见过的资源.
  2. 服务器响应资源以及ETag和max-age(24小时).
  3. 直到24小时过去,客户端才会使用缓存资源.
  4. 在到期日期之后,客户端将执行验证请求(If-None-Match: [etag])
  5. 如果资源没有改变:
    • 服务器响应 304 Not Modified
    • 客户端以某种方式告知现有资源从现在起24小时内有新的到期日期
    • 回到第3步

归结为它的本能... 304响应可以包含一个新的max-age?或者原来是否max-age受到后续要求的尊重?

conditional caching http http-caching

19
推荐指数
1
解决办法
6720
查看次数

如何使用CXF,JAX-RS和HTTP缓存

CXF文档中提到的缓存为高级HTTP:

CXF JAXRS通过处理If-Match,If-Modified-Since和ETags标头提供对许多高级HTTP功能的支持.JAXRS请求上下文对象可用于检查前提条件.还支持Vary,CacheControl,Cookies和Set-Cookies.

我真的很想使用(或至少探索)这些功能.然而,虽然"提供支持"的声音非常有趣,但它在实现这些功能方面并不是特别有用.有关如何使用If-Modified-Since,CacheControl或ETags的任何帮助或指示?

java rest cxf jax-rs http-caching

17
推荐指数
2
解决办法
1万
查看次数

尽管在响应对象上配置了高速缓存控制标头,但它们仍未响应

我正在尝试在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)

c# http-caching asp.net-web-api

17
推荐指数
2
解决办法
5679
查看次数

在CDN中缓存但不在浏览器中缓存

我目前使用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标头覆盖为硬编码的无缓存值,但我想知道是否有办法在源中执行此操作?

谢谢!

akamai cdn http-caching http-headers

14
推荐指数
2
解决办法
2万
查看次数

gzip_proxied指令有哪些选项?

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.

但是,我无法弄明白其他人.

每个选项的预期用例是什么?

gzip authorization nginx http-caching http-headers

14
推荐指数
1
解决办法
6131
查看次数

ASP.NET Core - 输出缓存和响应缓存之间的区别

ASP.NET Core 7 预览版 6 刚刚引入了输出缓存,它可以缓存端点输出。然而 ASP.NET 已经有了响应缓存,它似乎已经提供了相同的功能。
两者之间有什么区别?什么时候应该使用其中一种,什么时候应该使用另一种?

caching http-caching .net-core asp.net-core

14
推荐指数
1
解决办法
4637
查看次数

REST:我应该重定向到实体的版本URL吗?

我目前正在开发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的版本而不是实体.所以如果这是重复的话,请耐心等待.)

rest http-caching

13
推荐指数
1
解决办法
777
查看次数

使用send_data时如何设置Expires:标头

我的控制器中有一个方法,它使用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哈希中明确地设置它,但肯定必须有一个包装器(或其他东西)?

ruby-on-rails http-caching

12
推荐指数
2
解决办法
9991
查看次数

是否有必要将查询字符串附加到img标记中的图像和css中的图像以刷新缓存的项目?

我知道通常的做法是在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=1234base_1234.css自动时会重新加载?

而且,怎么样在图像srcimg标签都有效?

http http-caching

12
推荐指数
1
解决办法
1315
查看次数

如何检测XHR何时返回缓存资源?

我想知道是否有办法检测何时从本地缓存返回响应?可能吗?

解决方案应该是通用的,适用于无条件请求.在这种情况下,响应代码始终为200 OK,但XHR返回第二个请求的缓存资源(例如,第一个响应包含Expires头,因此无需在到期日期之前向服务器请求新资源).

ajax http xmlhttprequest http-caching http-headers

12
推荐指数
1
解决办法
2181
查看次数