AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1043592
Accepted
Selivanov Pavel
Selivanov Pavel
Asked: 2020-11-24 05:10:10 +0800 CST2020-11-24 05:10:10 +0800 CST 2020-11-24 05:10:10 +0800 CST

nginx:结合 Expires 和 Cache-Control:不可变标头

  • 772

nginxexpires指令设置 2 个标头,Expires并且Cache-Control:

配置:

expires 1d;

标题:

Expires: Tue, 24 Nov 2020 12:51:31 GMT
Cache-Control: max-age=86400

我想保留Expires标题但也设置Cache-Control为public, max-age=86400, immutable. 但这会产生双Cache-Control标题:

配置:

expires 1d;
add_header Cache-Control "public, max-age=86400, immutable"

标题:

Expires: Tue, 24 Nov 2020 12:57:53 GMT
Cache-Control: max-age=86400
Cache-Control: public, max-age=86400, immutable

我不能只使用add_header Expires ...,因为它需要将来的确切时间,而不仅仅是秒数。

我尝试使用more_set_headersngx_headers_more模块,但指令Cache-Control设置的标头expires仍然存在。

有没有办法将正确的Expires标题与Cache-Controlset to结合起来immutable?

nginx
  • 2 2 个回答
  • 1644 Views

2 个回答

  • Voted
  1. Best Answer
    Ivan Shatsky
    2020-11-24T05:34:02+08:002020-11-24T05:34:02+08:00

    标题的重复Cache-Control并不违反任何 W3C 标准。根据RFC 2616:

    当且仅当该标题字段的整个字段值被定义为逗号分隔列表[即,#(values)] 时,具有相同字段名称的多个消息标题字段可能出现在消息中。必须可以将多个头字段组合成一个“字段名称:字段值”对,而不改变消息的语义,方法是将每个后续字段值附加到第一个字段值,每个字段值用逗号分隔。因此,接收具有相同字段名称的头字段的顺序对组合字段值的解释很重要,因此代理在转发消息时不得更改这些字段值的顺序。

    此外,nginx 意识到这一点,尝试使用 nginx 指令设置一个不应包含多个值的add_header标头将导致覆盖该标头值而不是添加第二个值。这样您就可以安全地呆在

    expires 1d;
    add_header Cache-Control "public, immutable";
    

    配置。

    • 5
  2. Michael Hampton
    2020-11-24T05:33:53+08:002020-11-24T05:33:53+08:00

    Cache-Control: 标头可以出现多次,前提是这两个标头不尝试使用相同的指令。如果他们这样做,该指令将被忽略。(RFC 7234 § 4.2.1)

    因此,您可以让 nginx 使用指令发送其标头max-age,并仅使用其他指令发送您自己的标头。

    结果将是:

    Expires: Tue, 24 Nov 2020 12:57:53 GMT
    Cache-Control: max-age=86400
    Cache-Control: public, immutable
    

    (但如果max-age=86400出现在两个标题中,它将被忽略。)

    某些标头字段可能会出现多次,这是正常的,并且可以预料。RFC 7230 § 3.2.1 指定收件人可以将它们组合成一个单独的标头,但这不是必需的。

    • 4

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve