我在用着nginx 的expires
指令; 它是etag
指示以及Last-Modified
标题(如果我理解正确的话)默认处于开启状态。
为了在使用限制性内容安全策略 (CSP)标题(即没有'unsafe-inline'
资源策略)我想使用随机数。
我基本上遵循了Scott Helme 就此事撰写的文章,在我的试用版中使用 nginx$request_id
创建nonce
就像在 ServerFault 上讨论的那样(为了快速尝试这一点,而不必从头开始构建 nginx)。
然而,当我尝试这样做时,似乎缓存不再像我预期的那样工作:
Nginx 每次都以文件、新鲜内容Last-Modified
和ETag
标头进行响应,而不是304 Not Modified
我所希望的响应。
仔细想想,这是有道理的:nonce
CSP 标头以及源代码中的 会随着每个请求而变化。但是,其他内容没有变化。因此,可以说,这是一个变化“弱验证器”应该忽略(从而将请求的资源标记为不是已更改)。
话虽如此,我对服务器配置或缓存标头知之甚少。我所掌握的知识可能没有帮助,而且弱验证器本来就不应该那样工作。
此外,似乎浏览器混淆的问题当他们拥有一个带有旧文件的缓存版本nonce
但却获得了304 Not Modified
一个带有新文件的标题nonce
时(虽然我在试用中没有亲自看到过这种情况)。
我的问题基本上是:是否可以配置 nginx,以便缓存以某种方式工作,改变nonce
唯一(即通过文本替换动态发生的更改)当 nginx 创建Last-Modified
和ETag
标头时将被忽略(即它只查看磁盘上的文件更改) - 有效地使用可能很弱的验证器?
并且,假设浏览器混淆是一个问题,你能做些什么来阻止它吗,比如当服务器返回 304 时不返回 CSP 标头(以免用与“文件”不匹配的新标头替换浏览器的“标头”随机数)?(这更像是一个学术问题;我想我可以尝试不为响应设置 CSP 标头304
,也许使用ngx_headers_more
模块。
我是否真的可以选择使用 nonce 或缓存?或者这应该开箱即用(我看到的一切都归因于其他原因)?