Nginx常用模块学习---定制HTTP头信息定制ngx_http_headers_module设置响应头

蔚落 2023-06-10 13:23 6阅读 0赞

Nginx常用模块学习—定制HTTP头信息定制ngx_http_headers_module设置响应头

前言

HTTP头信息,是实际业务中一个很重要的功能。例如,如果需要将请求结果在浏览器上缓存一段时间,或者在请求代理到后端服务器的过程中生成一个唯一的 ID进行识别。通过对 Nginx进行配置,可以轻松实现这些功能。
ngx_http_headers_module是在 Nginx编译时默认自带的模块,主要包含 add_header和 expires两个指令。

使用语法

expires

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

示例如下:

  1. [root@ecs-21d5 nginx]# grep expires conf/nginx.conf
  2. expires -1; #输出响应头是cache-control: no-cache
  3. [root@ecs-21d5 nginx]# curl http://127.0.0.1:80/ -I
  4. HTTP/1.1 200 OK
  5. Server: nginx/1.17.4
  6. Date: Wed, 23 Oct 2019 15:05:34 GMT
  7. Content-Type: text/html
  8. Content-Length: 612
  9. Last-Modified: Wed, 23 Oct 2019 14:56:26 GMT
  10. Connection: keep-alive
  11. ETag: "5db06a1a-264"
  12. Expires: Wed, 23 Oct 2019 15:05:33 GMT
  13. Cache-Control: no-cache
  14. Accept-Ranges: bytes

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xMODQ1ODc2NDI1_size_16_color_FFFFFF_t_70

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

  1. [root@ecs-21d5 nginx]# grep -A 1 expires conf/nginx.conf
  2. expires 1h; # 输出响应头是cache-control: max-age=3600
  3. # 表示缓存1h,max-age 的单位是秒
  4. [root@ecs-21d5 nginx]# ./sbin/nginx -s stop
  5. [root@ecs-21d5 nginx]# ./sbin/nginx
  6. [root@ecs-21d5 nginx]# curl http://127.0.0.1:80/ -I
  7. HTTP/1.1 200 OK
  8. Server: nginx/1.17.4
  9. Date: Wed, 23 Oct 2019 15:12:29 GMT
  10. Content-Type: text/html
  11. Content-Length: 612
  12. Last-Modified: Wed, 23 Oct 2019 14:56:26 GMT
  13. Connection: keep-alive
  14. ETag: "5db06a1a-264"
  15. Expires: Wed, 23 Oct 2019 16:12:29 GMT
  16. Cache-Control: max-age=3600
  17. Accept-Ranges: bytes
  18. [root@ecs-21d5 nginx]#

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xMODQ1ODc2NDI1_size_16_color_FFFFFF_t_70 1
此配置只能在 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,即不进行缓存,代码如下:

  1. [root@ecs-21d5 nginx]# grep expires -A 4 conf/nginx.conf
  2. map $sent_http_content_type $expires{
  3. default off;
  4. application/pdf 1h;
  5. ~image 10h;
  6. }
  7. expires $expires;
  8. include mime.types;
  9. default_type application/octet-stream;
  10. [root@ecs-21d5 nginx]#

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xMODQ1ODc2NDI1_size_16_color_FFFFFF_t_70 2
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xMODQ1ODc2NDI1_size_16_color_FFFFFF_t_70 3

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

add_ header

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

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

示例如下:

  1. [root@ecs-21d5 nginx]# grep add_header conf/nginx.conf
  2. add_header Cachae-Control no-cache; # 等同于 expires -1;
  3. [root@ecs-21d5 nginx]# sbin/nginx -s stop
  4. [root@ecs-21d5 nginx]# sbin/nginx
  5. [root@ecs-21d5 nginx]#
  6. [root@ecs-21d5 nginx]#
  7. [root@ecs-21d5 nginx]# curl http://127.0.0.1:80/ -I
  8. HTTP/1.1 200 OK
  9. Server: nginx/1.17.4
  10. Date: Wed, 23 Oct 2019 15:44:52 GMT
  11. Content-Type: text/html
  12. Content-Length: 618
  13. Last-Modified: Wed, 23 Oct 2019 15:26:29 GMT
  14. Connection: keep-alive
  15. ETag: "5db07125-26a"
  16. Cachae-Control: no-cache
  17. Accept-Ranges: bytes
  18. [root@ecs-21d5 nginx]#
  19. [root@ecs-21d5 nginx]# curl http://127.0.0.1:80/aaa.html -I
  20. HTTP/1.1 404 Not Found
  21. Server: nginx/1.17.4
  22. Date: Wed, 23 Oct 2019 15:46:04 GMT
  23. Content-Type: text/html
  24. Content-Length: 153
  25. Connection: keep-alive
  26. [root@ecs-21d5 nginx]#

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xMODQ1ODc2NDI1_size_16_color_FFFFFF_t_70 4
在默认情况下, 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响应头信息。

  1. [root@ecs-21d5 nginx]# vim conf/nginx.conf
  2. [root@ecs-21d5 nginx]# grep add_header conf/nginx.conf
  3. add_header Cachae-Control no-cache always; # 等同于 expires -1;
  4. [root@ecs-21d5 nginx]# sbin/nginx -s reload
  5. [root@ecs-21d5 nginx]# curl http://127.0.0.1:80/a.html -I
  6. HTTP/1.1 404 Not Found
  7. Server: nginx/1.17.4
  8. Date: Wed, 23 Oct 2019 15:48:42 GMT
  9. Content-Type: text/html
  10. Content-Length: 153
  11. Connection: keep-alive
  12. Cachae-Control: no-cache
  13. [root@ecs-21d5 nginx]# curl http://127.0.0.1:80/ -I
  14. HTTP/1.1 200 OK
  15. Server: nginx/1.17.4
  16. Date: Wed, 23 Oct 2019 15:48:50 GMT
  17. Content-Type: text/html
  18. Content-Length: 618
  19. Last-Modified: Wed, 23 Oct 2019 15:26:29 GMT
  20. Connection: keep-alive
  21. ETag: "5db07125-26a"
  22. Cachae-Control: no-cache
  23. Accept-Ranges: bytes
  24. [root@ecs-21d5 nginx]#

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xMODQ1ODc2NDI1_size_16_color_FFFFFF_t_70 5

实战经验

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

  • 关于指令 expires 1h

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

  • 关于指令 add_ header

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

Last-Modified参考外链:

http://harttle.land/2017/04/04/using-http-cache.html

http://blog.csdn.net/eroswang/article/details/8302191

发表评论

表情:
评论列表 (有 0 条评论,6人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HTTP请求响应

    这篇文章简单总结一下HTTP请求头和响应头,并举一些web开发中响应头的用例。 1. HTTP请求头 accept:浏览器通过这个头告诉服务器,它所支持的数据类型。如: