2016-12-06 50 views
1

我有一个Web服务,它将ETag放在每个响应中,以便将来的调用可以使用HTTP 304(未修改)状态。 ETag实际上只是生成查询类型的Base64编码以及时间戳。ETag with Accept-Language

我遇到的问题是,如果浏览器请求具有区别Accept-Language的相同资源。浏览器当前发送相同的If-None-Match标题,所以响应是304,即使认为实际资源会以不同的语言返回。所以我认为这样做的方法是添加一个Vary Header,以向客户端指定该响应使用Accept & Accept-Language进行响应,如下所示。

各不相同:接受,接受语言

但是我的浏览器(Chrome)使用相同的ETag无论是接受语言的。在这里使用什么正确的约定?

谢谢

回答

0

电子标签标识响应内容。 所以最好使用E-Tag构造的响应体散列。 至少您可以使用查询和语言连接的散列。

+0

这对我来说似乎有点弱,我可以在ETag中编码实际的内容,但是当客户端试图在不同语言(fr)中使用相同的ETag作为相同的资源时,我将不得不简单地分配一个新的ETag for fr。当客户现在再次查询相同的内容时回到原来的语言,他们的fr ETag将被忽略,并将被传递一个新的ETag,所以他们不使用304.这个缓存解决方案似乎很弱,因为有一个解决这个用例(VARY),它通知客户端哪些http头会影响输出内容。 – Agent96