If-None-Match标头会忽略Content-Type和Vary

问题描述 投票:0回答:1

我有一个提供HTML和多种RDF格式的Web应用程序(在下面的示例中,它是RDF / XML)。页面自然加载为HTML,然后请求其自己的URL为RDF / XML。

问题:似乎Firefox 74.0(64位)(在Windows上)正在混淆来自这两个请求的ETag值,而忽略了不同的Content-Type和存在的Vary: Accept

当我重新加载页面时,可以看到它使用HTML请求中第二个(RDF / XML)响应中的ETag: "95e11fbc9e816b56",反之亦然:

Request URL: https://localhost:4443/6a6283d2-2a40-4882-b89d-8073a7c30e17/

Host: localhost:4443
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://localhost:4443/6a6283d2-2a40-4882-b89d-8073a7c30e17/
Connection: keep-alive
Cookie: _ga=GA1.1.828629977.1584086266; LinkedDataHub.first-time-message=true
Upgrade-Insecure-Requests: 1
If-None-Match: "95e11fbc9e816b56"
Cache-Control: max-age=0

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Strict-Transport-Security: max-age=31536000;includeSubDomains
ETag: "95e11fbc139f56de"
Cache-Control: max-age=3600, public
Last-Modified: Wed, 12 Feb 2020 23:05:15 GMT
Vary: Accept-Charset,Accept,Accept-Encoding
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Date: Sun, 22 Mar 2020 10:13:43 GMT
Request URL: https://localhost:4443/6a6283d2-2a40-4882-b89d-8073a7c30e17/

Host: localhost:4443
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: application/rdf+xml
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://localhost:4443/d376ee88-ff7d-48ee-81c4-1220c9f482f0/
Connection: keep-alive
Cookie: _ga=GA1.1.828629977.1584086266; LinkedDataHub.first-time-message=true
If-None-Match: "95e11fbc139f56de"
Cache-Control: max-age=0

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Strict-Transport-Security: max-age=31536000;includeSubDomains
ETag: "95e11fbc9e816b56"
Last-Modified: Wed, 12 Feb 2020 23:05:15 GMT
Vary: Accept-Charset,Accept
Content-Type: application/rdf+xml;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 22 Mar 2020 10:13:55 GMT

在Chrome上,我根本无法发送If-None-Match标头,但这很可能是due to the self-signed certificate

请注意,ETag值相似,但不同:"95e11fbc139f56de""95e11fbc9e816b56"

这对我来说没有任何意义。有什么解释吗?谢谢。

相关规格为Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests

http http-headers browser-cache etag http-caching
1个回答
1
投票

本质上,问题在于您所依赖的行为不是HTTP标准所强制的,并且也不是由浏览器实现的。

为了使您的方案有效,浏览器必须在其缓存中存储单个资源的多种表示形式。不幸的是,如文章like these所述,他们没有这样做。

浏览器通常不实现针对每个URL存储多个变体的功能。这样做的理由是,我们通常使用Vary的内容(主要是Accept-Encoding和Accept-Language)在单个用户的上下文中不会频繁更改。

所以问题不在于ETags,而是浏览器每次获得不同的表示形式时都会覆盖其缓存中的单个表示形式。

如果浏览器确实存储了多种表示形式,则该方案应该可以正常工作。在这种情况下,请注意,在多个ETags之间进行选择的是服务器而不是客户端。客户端将发送一个If-None-Match标头,其中包含它所知道的所有ETags,并且服务器将决定哪个(如果有的话)匹配请求的表示形式。

根据以上文章,边缘服务器(与浏览器相对)确实在每种资源的高速缓存中保留了多种表示形式,因此您的方案仍然有可能产生性能提升。

© www.soinside.com 2019 - 2024. All rights reserved.