标签: etag

If-Unmodified-Since/If-Modified-Since有什么意义?他们不是被ETags取代了吗?

似乎有两种不同的方法来使用HTTP头实现条件请求,这两种方法都可以用于缓存,范围请求,并发控制等......:

  1. If-Unmodified-Since和If-Modified-Since,客户端发送资源的时间戳.
  2. If-Modified和If-None-Modified,客户端发送资源的ETag表示.

在这两种情况下,客户端都会发送一条有关资源的信息,这使得服务器可以确定自客户端上次查看资源后资源是否已更改.然后,服务器根据客户端提供的条件头决定是否执行请求.

我不明白为什么有两种不同的方法可供使用.当然,ETags取代时间戳,因为服务器可以很容易地选择从时间戳生成ETag.

所以,我的问题是:

  • 在哪些情况下你可能喜欢If-Unmodified-Since/If-Modified-Since over ETags?
  • 在哪些情况下你可能需要两者?

rest etag http http-headers if-modified-since

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

如何用htaccess关闭Etag?

我的一位朋友说,etags在off模式下加速页面加载.如何用htaccess关闭etags?

.htaccess etag

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

是否可以使用JAX-RS设置ETag而无需使用Response对象?

在我发现的关于JAX-RS和缓存的少数几个问题(有答案)中,生成ETag(用于缓存)的答案是在Response对象上设置一些值.如下所示:

@GET
@Path("/person/{id}")
public Response getPerson(@PathParam("id") String name, @Context Request request){
  Person person = _dao.getPerson(name);

  if (person == null) {
    return Response.noContent().build();
  }

  EntityTag eTag = new EntityTag(person.getUUID() + "-" + person.getVersion());

  CacheControl cc = new CacheControl();
  cc.setMaxAge(600);

  ResponseBuilder builder = request.evaluatePreconditions(person.getUpdated(), eTag);

  if (builder == null) {
    builder = Response.ok(person);
  }

  return builder.cacheControl(cc).lastModified(person.getUpdated()).build();
}
Run Code Online (Sandbox Code Playgroud)

问题是对我们不起作用,因为我们对SOAP和REST服务使用相同的方法,通过使用@WebMethod(SOAP),@ GET(以及我们可能需要公开服务的任何其他方法)来注释方法.以前的服务对我们来说是这样的(不包括标题的创建):

@WebMethod
@GET
@Path("/person/{id}")
public Person getPerson(@WebParam(name="id") @PathParam("id") String name){
  return _dao.getPerson(name);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法 - 通过一些额外的配置 - 设置这些标题?这是我第一次发现使用Response对象实际上只比自动转换有一些好处...

我们正在使用Apache CXF.

java etag caching cxf jax-rs

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

Safari不发送"If-Modified-Since"和"If-None-Match"标头

我正在使用PHP生成动态内容.

我正在发送以下HTTP标头:

HTTP/1.1 304 Not Modified
Date: Sun, 09 Dec 2012 17:24:41 GMT
Server: Apache
Connection: keep-alive, Keep-Alive
Keep-Alive: timeout=1, max=100
Etag: "237f43b800e655dbe6567f7d32d34c99"
Expires: Sun, 16 Dec 2012 17:24:41 GMT
Cache-Control: max-age=604800
Vary: Accept-Encoding
Run Code Online (Sandbox Code Playgroud)

我后来检查Etag header('HTTP/1.1 304 Not Modified')是否匹配发送一个.这与Chrome和Firefox完美配合.但是,Safari(版本6.0.2)不会发送"If-Modified-Since"和"If-None-Match"标头.这是Safari在第二页上发送的Request-Header命中:

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Cache-Control: max-age=0
Run Code Online (Sandbox Code Playgroud)

在该页面上链接的所有其他文件在适当的时候接收正确的Request-Headers和Safari使用的缓存文件或304.

为什么不向Safari发送正确的Request-Header?我能改变什么?

谢谢!

php safari etag last-modified http-headers

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

Google Chrome不会反复重新验证etag

即使我发送"缓存控制:必须重新验证",Google Chrome在浏览器中使用来回按钮时也会使用本地缓存页面.

这是原始回复的一部分:

HTTP/1.1 200 OK
cache-control: private, must-revalidate
etag: "c9239b5d4b98949f8469a05062e05bb999d7512e"
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

如果我刷新页面,我得到一个"HTTP/1.1 304 Not Modified"响应但是当我使用后退按钮时,我得到以下响应:

Request URL:example.com
Request Method:GET
Status Code:200 OK (from cache)
Run Code Online (Sandbox Code Playgroud)

我正在寻找的响应是304或200 OK,是否有可能实现这一目标?

etag http cache-control browser-cache

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

使用Alamofire 4的eTag支持

我正在尝试在我的应用中启用eTag支持.我在我的快速3项目中使用Alamofire 4.

看来eTag是由Alamofire使用的URLRequest透明处理的:

NSURLCache和ETags

但它不起作用.

这是web服务器发送的http头:

headers {
    Connection = "keep-alive";
    "Content-Length" = 47152;
    "Content-Type" = "application/json";
    Date = "Tue, 06 Dec 2016 22:43:18 GMT";
    Etag = "\"ecf38288be2f23f6710cafeb1f344b8c\"";
} })
Run Code Online (Sandbox Code Playgroud)

你有什么提示吗?

非常感谢.

etag ios alamofire swift3

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

Python:如何使用feedparser和etags检查RSS更新

我正在尝试跳过未使用feedparser和etags修改的RSS源.遵循文档指南:http://pythonhosted.org/feedparser/http-etag.html

import feedparser

d = feedparser.parse('http://www.wired.com/wiredscience/feed/')
d2 = feedparser.parse('http://www.wired.com/wiredscience/feed/', etag=d.etag)

print d2.status
Run Code Online (Sandbox Code Playgroud)

这输出:

200
Run Code Online (Sandbox Code Playgroud)

这个脚本不应该返回304吗?我的理解是,当RSS源更新时,etag会发生变化,如果匹配,那么我应该得到304.

为什么我没有得到我预期的结果?

python rss etag feedparser http-headers

11
推荐指数
1
解决办法
3253
查看次数

同时利用etags和chunked编码?

更新的问题

我的应用程序如何利用etags,并引入流/分块编码引入任何复杂性?


原始问题

在进行HTTP流式传输时Transfer-Encoding: chunked,Content-Length无法发送,因为它通常是未知的.

据我所知,当浏览器利用etags时,他们需要知道Content-Length.如果提供了etag但不提供Content-Length,则浏览器将永远不会发送If-None-Match.

有没有解决的办法?

etag http-content-length http-status-code-304 if-none-match

11
推荐指数
1
解决办法
790
查看次数

IE 9+忽略ETag值更改并返回缓存响应

Etag提供的缓存验证适用于FF和chrome,但IE似乎忽略了Etag值并始终返回缓存的响应.

服务器响应是:

HTTP/1.1 200 OK
Date: Mon, 07 Jul 2014 06:01:57 GMT
Content-Type: application/json
ETag: a7628382056ddd13b7e06991571fd3ad
Content-Encoding: gzip
Content-Length: 4360
Run Code Online (Sandbox Code Playgroud)

当客户端发送条件获取请求时

If-None-Match: 71fb49ecd6f85545693dec0e78ae2131
Run Code Online (Sandbox Code Playgroud)

根本不发送请求,IE返回缓存的响应.当ETag值相同时它是透明的但是当ETag不同时它是一个问题.

对我有用的唯一解决方案是添加标题

Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)

我监控网络并强制IE验证ETag值.
问题解决了!
但是我没有找到任何正式的解决方案.我使用帖子Make IE来缓存资源,但总是重新验证作为参考,但大多数信息与我的问题无关.

如果您有其他想法或建议,请分享

etag internet-explorer caching

11
推荐指数
1
解决办法
2770
查看次数

Spring MVC REST中的ETag处理

我正在考虑从使用JAX RS的Apache CXF RS切换到Spring MVC REST,并看到Spring MVC REST当前处理ETag的方式存在一些问题.也许我不理解正确,或者有更好的方法来实现JAX RS目前正在做的事情?

使用Apache CXF RS,在REST服务内部评估上次修改时间戳和ETag的条件(条件评估实际上非常复杂,请参阅RFC 2616第14.24和14.26节,所以我很高兴这对我来说是完成的).代码看起来像这样:

@GET
@Path("...")
@Produces(MediaType.APPLICATION_JSON)
public Response findBy...(..., @Context Request request) {
       ... result = ...fetch-result-or-parts-of-it...;
       final EntityTag eTag = new EntityTag(computeETagValue(result), true);
       ResponseBuilder builder = request.evaluatePreconditions(lastModified, eTag);
       if (builder == null) {
              // a new response is required, because the ETag or time stamp do not match
              // ...potentially fetch full result object now, then:
              builder = Response.ok(result);
       } else {
              // a new response is not needed, …
Run Code Online (Sandbox Code Playgroud)

java rest etag jax-rs spring-mvc

11
推荐指数
1
解决办法
4494
查看次数