我正在尝试向etag
我开发的通过 NGINX 反向代理在 Apache 上运行的 Web 应用程序添加基于缓存的验证。该 Web 应用程序是用 Perl 编写的。在 Perl 脚本中,我检查标头$ENV{'HTTP_IF_NONE_MATCH'}
,然后测试etag
其中是否存在。如果我通过 cURL 访问该应用程序,它会起作用:
timothybutler@timothys-MacBook-Pro ~ % curl -I https://server/resource/podcast/20211101.mp3
HTTP/1.1 200 OK
Server: nginx/1.21.4
Date: Fri, 12 Nov 2021 18:06:37 GMT
Content-Type: audio/mpeg
Content-Length: 16665729
Connection: keep-alive
Surrogate-Control: no-cache
Cache-Control: private,max-age=864000
Etag: "1635825322"
通过 cURL返回后etag
,我得到了预期的结果:
timothybutler@timothys-MacBook-Pro ~ % curl -H 'If-None-Match: "1635825322"' -I https://server/resource/podcast/20211101.mp3
HTTP/1.1 304 Not Modified
Server: nginx/1.21.4
Date: Fri, 12 Nov 2021 18:19:29 GMT
Connection: keep-alive
Cache-Control: private, max-age=864000
Etag: "1635825322"
但是,如果我在 Chrome 中尝试,则该过程会中断。If-None-Match: "1635825322"
当我刷新页面时,Chrome 会报告发送为标头之一,但我的服务器不会HTTP_IF_NONE_MATCH
为该请求设置环境变量,这与通过 cURL 传入的请求相反。如果我转储所有 %ENV 哈希,则当 Chrome 发出请求时If-Match-None
,标头及其内容etag
根本不会以任何形式出现。