标签: http-caching

我正在尝试使用Java的HttpURLConnection来执行"条件获取",但我从未获得304状态代码

这是我的代码:

    final HttpURLConnection conn = (HttpURLConnection) sourceURL.openConnection();
    if (cachedPage != null) {
        if (cachedPage.eTag != null) {
            conn.setRequestProperty("If-None-Match", cachedPage.eTag);
        }
        conn.setIfModifiedSince(cachedPage.pageLastModified);
    }

    conn.connect();

    if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {

        newCachedPage.eTag = conn.getHeaderField("ETag");
        newCachedPage.pageLastModified = conn.getHeaderFieldDate("Last-Modified", 0);

    } else if (conn.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) {
        // Never reaches here
    }
Run Code Online (Sandbox Code Playgroud)

我似乎永远不会得到HTTP_NOT_MODIFIED响应代码,甚至连续多次点击同一台服务器 - 页面肯定没有变化.此外,conn.getHeaderField("ETag")似乎总是响应null,有时conn.getHeaderFieldDate("Last-Modified",0)返回0.我已经尝试过针对各种Web服务器.

谁能告诉我我做错了什么?

java caching http http-caching

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

Symfony 2中的Edge Side包含和验证缓存

是否可以在ESI与Symfony 2中使用验证缓存?

如果查看HttpFoundation Response类,可以看到isNotModified的工作原理:

/**
 * Determines if the Response validators (ETag, Last-Modified) match
 * a conditional value specified in the Request.
 *
 * If the Response is not modified, it sets the status code to 304 and
 * removes the actual content by calling the setNotModified() method.
 *
 * @param Request $request A Request instance
 *
 * @return Boolean true if the Response validators match the Request, false otherwise
 *
 * @api
 */
public function isNotModified(Request $request) …
Run Code Online (Sandbox Code Playgroud)

http-caching symfony esi

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

为什么Chrome在这两种情况下使用不同的客户端缓存?

我正在使用HTML5开发一个小型的单页应用程序.一个功能是显示嵌入在页面中的PDF文档,可以从列表中选择哪些文档.

我正在尝试制作Chrome(首先,然后是所有其他现代浏览器)使用本地客户端缓存来完成对PDF文档的简单GET请求,而无需通过服务器(当然不是第一次).我通过<object>在HTML中的元素上设置"data"属性来请求PDF文件.

我找到了XMLHttpRequest的一个工作示例(不是<object>).如果您使用Chrome的开发人员工具(网络标签),您可以看到第一个请求发送到服务器,并导致对这些标头的响应:

Cache-Control:public,Public
Content-Encoding:gzip
Content-Length:130
Content-Type:text/plain; charset=utf-8
Date:Tue, 03 Jul 2012 20:34:15 GMT
Expires:Tue, 03 Jul 2012 20:35:15 GMT
Last-Modified:Tue, 03 Jul 2012 20:34:15 GMT
Server:Microsoft-IIS/7.5
Vary:Accept-Encoding
Run Code Online (Sandbox Code Playgroud)

第二个请求是从本地缓存提供的,没有任何服务器往返,这就是我想要的.

回到我自己的应用程序,然后我使用ASP-NET MVC 4并设置

[OutputCache(Duration=60)]
Run Code Online (Sandbox Code Playgroud)

在我的控制器上.对此控制器的第一个请求 - 使用URL会http://localhost:63035/?doi=10.1155/2007/98732产生以下标题:

Cache-Control:public, max-age=60, s-maxage=0
Content-Length:238727
Content-Type:application/pdf
Date:Tue, 03 Jul 2012 20:45:08 GMT
Expires:Tue, 03 Jul 2012 20:46:06 GMT
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT
Server:Microsoft-IIS/8.0
Vary:*
Run Code Online (Sandbox Code Playgroud)

第二个请求导致另一个到服务器的往返,响应更快(建议服务器端缓存?)但返回200 OK和这些标头:

Cache-Control:public, max-age=53, s-maxage=0
Content-Length:238727
Content-Type:application/pdf
Date:Tue, 03 …
Run Code Online (Sandbox Code Playgroud)

pdf asp.net-mvc google-chrome http-caching

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

If-Modified-Since在浏览器中覆盖If-None-Match

我有一个Web服务器,为特定的URL提供ETag.当浏览器执行对此URL的请求时,它提供http-header"If-None-Match",其中包含来自服务器的该URL的先前响应中包含的ETag值.现在,如果我编程添加请求头"如果-Modified-Since的"并将其设置为一个或者是将来或过去的日期(无所谓),浏览器停止发送"如果 - 无 - 匹配" -header.我在FireFox和Chrome中都看到过这种情况(未经任何其他浏览器测试).我不能从HTTP/1.1规范中得出结论,应该是这种情况.为什么会这样?

这是一个简单的代码示例,将重现该场景.该代码假定服务器使用Etag标头进行响应.

var request = new XMLHttpRequest();
request.open("GET", someUrl, true);
request.onreadystatechange = function(){};

// This statement makes the browser stop sending the "If-None-Match" header
request.setRequestHeader("If-Modified-Since", "Sat, 29 Oct 1994 19:43:31 GMT"); 

request.send(null);
Run Code Online (Sandbox Code Playgroud)

http http-caching browser-cache http-headers

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

Rails 4中的AJAX,HTML5历史API和缓存

我正在移动一个Rails应用程序,它通过URL将新视图加载到完全AJAX版本.我们这样做的方式是通过AJAX加载所有视图并通过HTML5 History API更改URL.我们还想在整个过程中使用HTTP缓存,以便我们可以缓存每个部分.

但现在我们陷入了一个问题.现在基本上有两种方法可以加载每个页面 - 通过URL或点击通过AJAX加载部分内容的方法.但这导致我们创建两个不同的视图和控制器,基本上加载相同的东西 - 一个直接来自URL,一个通过点击主页面并通过AJAX和历史API加载.那么,当通过URL和AJAX直接加载时,我们如何确保从浏览器缓存中加载相同的视图?

举个例子,GitHub在它们的树形滑块中使用.您可以通过在窗口中浏览代码或直接使用URL路径直接访问代码.我确定如果之前已经加载了页面,它们会从浏览器缓存中获取部分内容.

有没有办法将请求发送到同一个URL但只是渲染部分或加载整个页面,具体取决于是通过单击选项卡还是在地址栏中输入请求?它应该使用缓存的部分,如果它们已经存在于浏览器中.

谢谢

ajax html5 ruby-on-rails http-caching html5-history

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

ETags:验证和缓存 max-age

我已经使用 ETag 有一段时间了,我对如何使用它们以及它们允许做什么感到满意。

但是,我有时会遇到 ETag 验证请求。在我的服务器上,我可以看到我的浏览器访问了资源 URL,然后得到了“未更改”响应。但是,它仍然是一个请求。 

一个聪明的网络服务器(我在 NodeJS 中编写我的代码)如何避免长时间受到验证的影响cache-control: max-age=N

例如,mymax-age表示 TTL 为 30 天。客户根本不应该在那个时候验证 Etag。那可能吗?

validation etag http-caching http-headers

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

缓存控制标头中多个值的含义

我读过有关单个缓存控制标头值的内容。为了测试我学到的东西,我打开 Facebook 并进行检查。这是我得到的 Cache-Control 响应标头:

cache-control:private, no-cache, no-store, must-revalidate
Run Code Online (Sandbox Code Playgroud)

我很困惑这个标头实际上告诉了什么,因为它一次包含 4 个值。那么,如果通过网络发送的资源包含这样的标头,会发生什么情况呢?

编辑:

no-store 表示“根本不存储,不在私有非公共缓存中存储”,no-cache 表示“是的,您可以缓存,但请确保在请求资源时重新验证新鲜度”。Private 表示“您可以存储在私有缓存中”。它不能同时完成这三件事。但是,我们让他们同时发送响应。看起来还有一些我不知道的附加规则。

caching http cache-control http-caching browser-cache

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

ETag标头不返回304

我目前正在使用REST API.我想检查HTTP缓存是否正常工作,但不幸的是我根本不工作.无论我做什么,它总是返回HTTP代码200,而它应该从我所知道的返回304.

这是我的PHP代码:

public function getList()
{
    $this->addHeaders(array(
        'Cache-Control' => 'public, must-revalidate, max-age=120',
        'eTag' => 'xyz123',
    ));

    $array = array(
        'foo' => 'bar',
        'nested' => array(
            'lorem' => 'ipsum',
            'dolor' => 'sit amet'
        )
    );

    $this->addHeader('Content-Length', strlen(json_encode($array, true)));

    return new JsonModel($array);
}
Run Code Online (Sandbox Code Playgroud)

响应/请求

在此输入图像描述

ETag不会更改,因此除了第一个请求之外的请求应该从缓存中提供.我错了吗?

我正在关注这两篇文章:

我还检查了弱验证器 - Last-Modified但我遇到了同样的问题.浏览器在Request中发送正确的标头,但我仍然得到200响应

php http http-status-codes http-caching http-headers

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

Chrome 不缓存 css 文件。缓存适用于 .js/.png 文件。

我观察到 CSS 文件没有被缓存在 Chrome 浏览器上。我的应用程序由 Angular-CLI 构建,所有必需的缓存控制标头和 Expires 标头设置为 5 分钟:

Accept-Ranges:bytes
Cache-Control:max-age=600
Content-Encoding:gzip
Content-Type:text/css
Date:Wed, 13 Sep 2017 05:11:17 GMT
ETag:W/"441246-1505278984000"
Expires:Wed, 13 Sep 2017 05:21:18 GMT
Last-Modified:Wed, 13 Sep 2017 05:03:04 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
Vary:Accept-Encoding
Run Code Online (Sandbox Code Playgroud)

使用相同响应头设置的 JS 文件按预期缓存。.css 文件也缓存在 Firefox Mozilla 中。我搜索了帖子,几乎没有帖子建议是:

  1. 如果出现任何 SSL 错误,Chrome 有时不会缓存提供自签名证书和使用 HTTPS 的资源。但就我而言,所有其他文件(如 .js、.png 文件)都在同一频道上运行并被缓存。

  2. Transfer-Encoding: chunked导致在缓存上镀铬的任何问题?不过它在 FireFox 中运行良好。

  3. gzip 压缩不适用于 Chrome:https : //github.com/expressjs/compression/issues/64

任何指示/建议?

css google-chrome http-caching

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

System.Net.Http.HttpClient 禁用缓存(.Net 标准项目)

在我的 .NET Standard 项目中,我使用System.Net.Http.HttpClient. 如何禁用所有缓存(尤其是请求缓存)HttpClient

如果服务器发送没有缓存头的响应,问题就解决了。但我想在客户端做这个。我想完全禁用所有缓存。

谢谢。

编辑:看起来我可以使用,WebRequestHandler但这在 .NET 标准中不存在。我只能使用HttpClientHandlerHttpClientHandler没有任何关于缓存的选项。

c# httpclient http-caching

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