标签: http-caching

'Vary:If-None-Match'分别缓存移动和桌面请求

注意:如果我的任何假设错误,请纠正我.我不太确定这个......

我一直在玩Heroku上的HTTP缓存,并尝试在Heroku上使用Varnish进行缓存时尝试区分移动和桌面请求.

我的第一个想法是我可以设置一个Vary标题,以便缓存变化If-None-Match.由于Rails自动发回从内容散列生成的etags,etag会在桌面和移动请求(不同的模板)之间变化,因此最终会缓存两个版本(不是事实,只是我原来的想法).我一直在玩这个,但我认为它不起作用.

首先,我无法包围我/当有任何东西被缓存,因为肯定If-None-Match会有条件获得请求吗?其次,在实践中,新的请求(没有If-None-Match的请求)有时会收到移动站点.这是因为缓存不知道是否提供移动或桌面缓存版本,因为If-None-Match标头不存在?

听起来很可能,我很困惑.这种方法会以任何方式运作,还是我很傻?另外,如果我无法达到Varnish配置(因为我在Heroku上),无论如何都要实现单独的缓存版本?

我在Rails中用来设置缓存头的确切代码是:

response.headers['Cache-Control'] = 'public, max-age=86400'
response.headers['Vary'] = 'If-None-Match'
Run Code Online (Sandbox Code Playgroud)

编辑:我知道我可以使用,Vary: User-Agent但如果可能的话,尽量避免它,因为它有很高的漏洞率(很多很多用户代理).

ruby-on-rails heroku varnish http-caching

5
推荐指数
1
解决办法
1157
查看次数

OutputCache.VaryByHeader未在响应中生成Vary标头

我有这个动作方法:

    [OutputCache(Duration = 2, 
                 Location = OutputCacheLocation.Any, 
                 VaryByHeader = "Accept-Charset")]
    public ActionResult Index()
    {
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

生成的响应是:

Cache-Control:public, max-age=2
Content-Length:5164
Content-Type:text/html; charset=utf-8
Date:Wed, 28 Sep 2011 16:30:33 GMT
Expires:Wed, 28 Sep 2011 16:30:35 GMT
Last-Modified:Wed, 28 Sep 2011 16:30:33 GMT
Server:Microsoft-IIS/7.5
Vary:*
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:3.0
X-Powered-By:ASP.NET
Run Code Online (Sandbox Code Playgroud)

为什么Vary标题显示星号而不是Accept-Charset

OutputCacheAttribute确实对响应有影响,实际上,ExpiresCache-Control:max-age=n头部取决于Duration参数,而Cache-Control:public/ private/ no-cache取决于Location参数.

我已经创建了一个包装器OutputCacheAttribute来查看发生了什么:

public class CustomOutputCacheAttribute:OutputCacheAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    { …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-mvc caching outputcache http-caching

5
推荐指数
1
解决办法
2842
查看次数

当提供max-age和Last-Modified标头时,Webkit不会缓存

我有一个基于Web的应用程序与自定义Web服务器的编写,我遇到webkit浏览器的问题,而不是缓存图像,样式表和JavaScript.

我已将其跟踪到Cache-Control:max-age和Last-Modified之间的某种关系.如果同时指定了两者,则webkit似乎忽略max-age标头并检查文件是否在每次使用资源时都被修改.该网站在第一页上有一个iframe,它会导致样式表等在一秒内被请求两次!

如果删除Last-Modified,则在第二天之前不会重新请求文件; 但是,第二天的请求将不再是if-modified-自请求以来,要求服务器重新发送所有内容,而不仅仅是304头.

在IE9,Firefox 10.0和Opera 11.61上,浏览器正确缓存并且不重新请求图像,只有HTML,它具有Cache-Control:no-cache头属性.

在Chrome 16.0.912.77 m和Safari 5.1.2(7534.52.7)上,每次都会对每个页面上的每个图像发出一个条件请求.服务器以304标头响应,同样包含max-age属性,但它们都继续请求.

我通过响应发送的示例HTTP标头是:

HTTP/1.1 200 OK
Date: Mon, 06 Feb 2012 15:12:12 GMT
Cache-Control: max-age=86400
Content-length: 708
Content-type: image/gif
Last-Modified: Fri, 6 Jan 2012 14:39:07 GMT
Server: Webspring
Run Code Online (Sandbox Code Playgroud)

有没有人有任何关于如何让这些浏览器尊重我的缓存标头的建议?

所有浏览器都在Win7 Pro x64上运行,上面的HTTP标头是Fiddler的原始输出,因此这正是浏览器接收的内容.

注意:在我发现这是头字段之间的交互之前,我曾问过上一个问题.我删除了之前的问题,因为它不再准确.

谢谢

webkit http-caching

5
推荐指数
1
解决办法
1733
查看次数

TLS握手和SSL会话重用

我有一个网站(来自客户端)在Win 2008 R2 Standard服务器上访问WCF服务.WCF服务托管在IIS 7.5上.连接是HTTPS加密的.我无法访问客户端的服务器.

为了调试问题,我需要检查客户端发送的请求.我正在使用WireShark 1.10.3.为了这.我能够获得解密信息,我首先运行WireShark,并使用Full Handshake连接2台服务器.如果服务器使用Abbreivated Handshake,WireShark无法解密.

缩写握手采用称为SSL会话重用的技术,其中两个服务器将加密/解密信息存储在高速缓存中.这消除了完全握手所需的步骤,并在未来的请求中节省了CPU.我读到这个缓存的默认TTL是10个小时,但我还没有找到设置它的位置.当任一服务器缓存中没有信息时,TLS by specification执行完全握手.在Full Handshake之后,它会自动缓存信息,以便它可以进行缩写握手.

由于我正在调试,我必须多次运行许多场景.

我发现,确保两台服务器进行完全握手的唯一方法是重启我的服务器.这将清除缓存和会话信息,并强制服务器进行完全握手.

显然,每次重新启动我的服务器我都会回来测试这个问题并不理想.我做了一些研究,发现一些文章建议我可以通过将注册表项HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\ClientCacheTime\Value设置为0来禁用SSL会话重用.

http://blogs.msdn.com/b/huizhu/archive/2009/12/17/ssl-_2f00_tls-full-handshake-vs.-abbreviated-handshake.aspx http://support.microsoft.com/kb/ 247658

文章建议这将禁用加密信息的缓存.然而,这对我没用.我错过了什么吗?

有没有其他方法可以禁用SSL会话重用或一种无需重启就能破解缓存的方法?

ssl http-caching public-key-encryption iis-7.5

5
推荐指数
1
解决办法
2986
查看次数

如何使控制器URL的缓存无效?

我想在symfony2中使HTTP缓存无效.我使用以下方法:

protected function invalidateCache($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PURGE');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, true);

    curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return $status == 200;
}
Run Code Online (Sandbox Code Playgroud)

这工作,没问题.但是当我使用ESI包括我的controller()函数(而不是path())时:

{{ render_esi(controller('AcmeDemoBundle:Default:index')) }}
Run Code Online (Sandbox Code Playgroud)

如何获取控制器功能生成的URL?或者我如何使该esi请求的缓存响应无效?

caching http-caching symfony esi

5
推荐指数
1
解决办法
1022
查看次数

明确禁用REST服务的缓存

我将应用于Cache-Control: must-revalidate,no-cache,no-store后端REST服务的所有响应。我对此有两个问题:

  • 这样做很常见吗?出于某种原因,我认为这没有必要,但是我没有消息来源支持这一说法(尚未)。
  • 我上面提到的值真的足够,还是应该设置更多?

编辑:发现了这个:https : //devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers#cache-prevention。有人说,当没有明确配置任何内容时,浏览器可能会选择缓存,因此,是的,如果我要确保禁用缓存,就应该配置它。

rest http-caching

5
推荐指数
1
解决办法
5330
查看次数

可以通过浏览器缓存500 Internat Server Error响应吗?

在调试生产问题时,我们发现对URL的GET请求正在500 Internal Server Error为一个用户返回200 OK,但为其他人返回.看起来500是从缓存中提供的,但是自从重现这个bug以来的任何尝试都没有成功.

我的问题是:是否可以通过浏览器缓存错误响应?如果是这样,哪些浏览器支持它以及我需要复制它的缓存头?

我的直觉是不应缓存错误响应,因为即使修复了错误,您仍将继续被拒绝服务.基于哪些HTTP状态代码可缓存?它看起来似乎500不应该是可缓存的.缓存策略是否跨浏览器一致地实施?

browser cache-control http-caching browser-cache

5
推荐指数
1
解决办法
2325
查看次数

NGINX,ssl,CORS和Access-Control-Allow-Origin值跨站点缓存

我正在尝试编写一个可以同时在http和https上处理两个站点的nginx配置,只要客户端从未访问过两个站点,它似乎就可以工作,但是如果这样做的话,则存在缓存/跨站点问题。

# Allow cross origin
location ~* \.(eot|svg|ttf|woff|woff2|json)$ {
    if ($http_origin ~* (https?://(admin\.)?example\.com(:[0-9]+)?)) {
        add_header 'Access-Control-Allow-Origin' "$http_origin";
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我加载example.com,则一切正常,但是当我加载admin.example.com时,会遇到类似问题

(索引):1 XMLHttpRequest无法加载 http://origin.example.com/js/data-lib/currency.json。“ Access-Control-Allow-Origin”标头具有值“ http:// example”。com”不等于提供的来源。来源'http:// admin。例子 因此,不允许访问“ com”。

据我所知,这是因为浏览器将原始请求及其附带的标头缓存了起来,现在,即使来自服务器的另一个请求允许它,它也拒绝了我。证明是,如果我在Chrome开发者工具中选中了“禁用缓存”,则该问题将永远不会发生。

我该如何解决这个问题?是否可以在一个配置中同时完成多个域+ ssl / http,还是有必要根据请求的域和协议将其拆分?

(对我示例中的可怕空间感到抱歉,显然,StackOverflow认为我在编写示例时试图发布链接)

xss http nginx http-caching cors

5
推荐指数
1
解决办法
2424
查看次数

用户代理可以在其请求中将max-age设置为大于零吗?

max-age在阅读Http Cache rfc后,我对行为有疑问.

场景:

用户代理

GET /foo
Run Code Online (Sandbox Code Playgroud)

Origin Server Response标头

cache-control: max-age=120
Run Code Online (Sandbox Code Playgroud)

服务器告诉用户代理在2分钟后应该重新验证所请求的资源.

1分钟后,用户代理发出另一个请求,指定max-age1分钟:

用户代理

cache-control: max-age=60
GET /foo
Run Code Online (Sandbox Code Playgroud)

据我所知,此请求应绕过用户代理缓存.
为什么?
虽然Origin Server告诉客户端资源应缓存2分钟,但用户代理需要一个最多1分钟的资源(max-age = 60).
从第一个开始经过1分钟和几秒钟后GET,该资源无效(从用户代理的角度来看),请求应直接进入原始服务器(或任何其他缓存层).

我对吗?是否可以从用户代理指定max-age大于零?它是否受到常见浏览器的支持/尊重?

在我工作的地方,我们有一个.NET自定义缓存机制,就像这样工作; 客户端可以指定max-age何时需要来自缓存的资源,该资源是"AT MOST"X秒.

caching http http-caching http-headers max-age

5
推荐指数
1
解决办法
366
查看次数

为什么缓存控制请求的HTTP头?

我最近浏览了这篇文章.它说不仅响应,请求还可以包括cache-control选项.

虽然我明白,它可以被服务器响应有意义地使用,我不清楚理解为什么它们在请求中是需要的.不幸的是,我在互联网上找不到任何能解决我问题的方法.

有谁有想法?

http httpclient cache-control http-caching httpserver

5
推荐指数
1
解决办法
1226
查看次数