Nginx 中常见 header 配置及修改
作者:mmseoamin日期:2023-12-25

在 nginx 中,经常需要因为各种原因,修改 header,所以今天整理下 nginx 中 header 的一些指令

header 是 http 中的消息头,里面包含很多信息,通常又分为 request headers(请求头)和 response headers(响应头)

客户端向服务器发送的请求中包含请求头,服务器向客户端回复的响应中包含响应头,消息头通常是以冒号分隔的键值对

Nginx 中常见 header 配置及修改,第1张

在 nginx 中有 headers 模块,其中有三条指令,分别是:

  • add_header

  • add_trailer

  • expires

    expires 就不用多说了,用来控制缓存时间的,证书就是缓存的时间,0 或负数就是缓存无效

    add_trailer 和 add_header 一样的效果,都是在 headers 中添加字段,不过 trailer 是添加到响应头的末尾

    nginx 中通常就通过这三个控制 response 的 headers 信息

    另外涉及到 headers 修改的指令,通常是在反向代理的时候,也就是 proxy_pass 的时候,有以下几个指令可以操作 header

    • proxy_set_header

    • proxy_ignore_headers

    • proxy_pass_header

    • proxy_hide_header

    • proxy_pass_request_headers

      proxy_set_header 通常用的最多,可以在提交给上游服务器的 header 中添加或重写 header,比如通常用到的,反向代理的时候,添加客户端 IP、XFF 等字段

      Nginx 中常见 header 配置及修改,第2张

      proxy_ignore_headers 通常用来禁用上游服务器的某些响应字段,如:

      • X-Accel-Expires

      • Expires

      • Cache-Control

      • Set-Cookie

      • Vary

      • X-Accel-Redirect

      • X-Accel-Limit-Rate

      • X-Accel-Buffering

      • X-Accel-Charset

        不过根据测试发现,根本不起任何作用,写了个简单的 php 脚本,用 proxy_pass 代理,在 php 中用 header 写 Expires 字段

        Nginx 中常见 header 配置及修改,第3张

        访问查看 response headers

        Nginx 中常见 header 配置及修改,第4张

        接着,用 proxy_ignore_headers 忽略掉 Expires 字段,再次请求看下效果

        Nginx 中常见 header 配置及修改,第5张

        Nginx 中常见 header 配置及修改,第6张

        没有任何效果,开始以为是在 php 中写不行,写到上游 nginx 配置中尝试

        Nginx 中常见 header 配置及修改,第7张

        访问测试,仍然没有忽略掉

        Nginx 中常见 header 配置及修改,第8张

        生效的,仍然是后端的 expires,从官方以及网上看到的文章,我理解,都是忽略上游设置的 Expires

        不过 proxy_hide_header 可以将上游响应中的 header 中的字段忽略掉

        Nginx 中常见 header 配置及修改,第9张

        请求如下:

        Nginx 中常见 header 配置及修改,第10张

        proxy_pass_header 正好和 proxy_hide_header 相反,有些 header 字段 nginx 默认不会响应到代理,nginx 官方文档中举例说 Date、Server、X-Pad、X-Accel 等字段,测试,同样在 php 中设置 Server

        Nginx 中常见 header 配置及修改,第11张

        在 nginx 中设置 proxy_pass_header Server

        Nginx 中常见 header 配置及修改,第12张

        proxy_pass_request_headers 则是控制客户端 request 的 header,是否传递到上游服务器,默认是开启的,也就是客户端请求携带的 header,都会被转发到上游服务器,还是拿 php 脚本来获取 request_header 信息

        Nginx 中常见 header 配置及修改,第13张

        查看访问结果:

        在 nginx 中关闭 proxy_pass_request_headers

        Nginx 中常见 header 配置及修改,第14张

        再次获取访问结果

        Nginx 中常见 header 配置及修改,第15张

        以上就是 nginx 自带的调整,设置 header 的一些指令,通常调整 header 最常见的几个场景:

        • 通过 add_header 添加允许跨域

        • 通过 header 头,设置缓存生效时间

        • 通过添加自定义 header,做灰度

        • 反向代理,将自定义字段传递到后端,特别 xff 获取真实客户端 IP

          除了自带的 headers 模块,也可以安装第三方的 headers-more 模块,对应 headers 的控制更全面,更方便,headers-more 是 openresty 的一个模块,openresty 就自带了,nginx 的话,需要编译添加动态模块

          headers-more 模块下载地址:GitHub - openresty/headers-more-nginx-module: Set, add, and clear arbitrary output headers in NGINX http servers

          下载好之后编辑添加

          Nginx 中常见 header 配置及修改,第16张

          通过 make modules,编译动态模块文件,生成在 objs 目录下,将.so 文件复制到 modules 目录下,在 nginx 配置文件中通过 load_modules 加载

          Nginx 中常见 header 配置及修改,第17张

          这样 headers-more 模块就添加好了

          该模块主要有 4 个指令:

          • more_set_headers 用于添加、修改、清除响应头

          • more_clear_headers 用于清除响应头

          • more_set_input_headers 用于添加、修改、清除请求头

          • more_clear_input_headers 用于清除请求头

            headers-more 相比 nginx 自带的 headers,处理 headers 更方便,更灵活,所以,如果有 nginx 自带 headers 模块满足不了的需求,可以添加 headers-more 模块