nginx 变量 自定义header_Nginx常用模块---ngx_http_headers_module设置HTTP响应头

本文介绍了Nginx的ngx_http_headers_module模块,用于设置HTTP响应头,如expires和add_header指令。expires指令用于设置缓存时间,add_header则允许添加自定义响应头。Nginx 1.7.9后,expires可使用变量根据Content-Type动态调整缓存。add_header配合always参数可在任何HTTP状态下输出响应头,但要注意可能引发的重复响应头问题。实战经验中强调了Last-Modified响应头的重要性以及使用规范的必要性。
摘要由CSDN通过智能技术生成

Nginx常用模块---ngx_http_headers_module设置HTTP响应头

HTTP头信息,是实际业务中一个很重要的功能。例如,如果需要将请求结果在浏览器上缓存一段时间,或者在请求代理到后端服务器的过程中生成一个唯一的 ID进行识别。通过对 Nginx进行配置,可以轻松实现这些功能。

ngx_http_headers_module是在 Nginx编译时默认自带的模块,主要包含 add_header和 expires两个指令。

使用语法

expires

expires语法: expires [modified] time; expires epoch | max | off;默认值: expires off;环境: http、 server、 location、 if in location用途:设置 Expires和 Cache-Control响应头字段,主要作用是控制缓存时间,如在浏览器上的缓存时间、 CDN的缓存时间。参数值可以是正数、负数或零;

示例如下:

e7d88740748fb676523324540f3efbd0.png

如果要求在浏览器第一次访问后,数据在浏览器上缓存 1h,则配置如下:

0263f946fa0141c5420a67f09abe797e.png

此配置只能在 HTTP状态码是 200、 201、 204、 206、 301、 302、 303、 304、 307或 308时才会生效。

即只有当请求处于正常的返回状态时,才会发送缓存头,毕竟在浏览器上缓存一个错误状态不是什么好事情。

在 Nginx 1.7.9版本之后, expires指令可以使用变量来配置响应头,并根据响应头的 Content-Type来定义缓存时间,也就是可以根据不同的条件动态地调整缓存时间。

例如,如果 Content-Type是 application/ pdf,则添加 cache-control: max-age = 3600响应头信息;如果 Content-Type是 image/,则添加 ache-control: max-age = 36000响应头信息;如果没有匹配到对应的 Content-Type,则执行 default的配置 off,即不进行缓存,代码如下:

a1050cdea83dc4d52e3e62bed0900485.png
5d1050c1f039f854773e856a90d72d97.png

在上述配置中, map指令会根据响应头 Content_ Type的值对 $expires进行赋值(通过 $ sent_ http_ content_ type获取 Content-Type的值)。

add_ header

语法: add_ header name value [always];默认值:无环境: http、 server、 location、 if in location用途:添加自定义的响应头。

例如,可以用来添加 Cache-Control响应头,以达到 expires指令的效果,不过它不如 expires那样简洁、明了,

示例如下:

a3d7e82090b74a33d8867608b969f8a8.png

在默认情况下, add_ header只能在 HTTP状态码是 200、 201、 204、 206、 301、 302、 303、 304、 307或 308时输出响应头,如果出现 404、 500等异常状态码则无法输出响应头。

但 Nginx 1. 7. 5以上的版本新增了 always参数,使之可以在任何 HTTP状态下输出响应头,示例如下:响应头信息输出如下:测试结果表明,即使发生了 500错误,加入 always参数后依然可以输出 add_header响应头信息。

d1960366aa4a5ae090e7d3b00a1229db.png

实战经验

添加请求头有很多需要注意的地方,下面是在长期使用中总结的一些经验,供参考。

  • 关于指令 expires 1h

expires 1h表示在浏览器上的缓存时间是 1h,但如果缺少 Last-Modified响应头(文末有说明),大部分浏览器不会使用缓存。在业务代码生成过程中,部分代码可能没有使用规范的框架输出数据,因此可能会缺少 Last-Modified信息,无法在浏览器上进行缓存,但请求仍会回源到服务器上,导致带宽压力增大。因此负责网络带宽和用户体验的技术人员要对使用规范进行说明和管理,避免出现缓存效果不理想的情况。

  • 关于指令 add_ header

如果使用 always参数,那么即使在业务出现异常时,也会输出 add_ header响应头信息,因此要慎重使用此参数。另外,如果后端服务器在返回响应体时返回了一个和 add_ header相同的响应头,则会导致两个响应头重复输出到浏览器上,从而引起不必要的 Bug

关于Last-Modified的说明:

defe1f5e2d6921a2cf103402f567cc07.png
9569bea145068eab561c4375d6eff676.png
62ddd90f7f175d1140ecb9ee89b25d37.png
76d9cb4df4f48177bb651f83399783ca.png
436b1baa3a940c50fad662b6678d0b29.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值