0. 概述

最近在做一个特性,考虑使用 Nginx 判断请求头做一些处理,于是就调研了一下,本文就记录一下结果,同时后续还保持更新各种遇过或者见过的关于 nginx 请求头处理的一些信息。

关于 Nginx 的请求头,Nginx 有一个特殊的规则,就是在 Nginx 的配置中,$http_xxxx 其实就是对原始 HTTP 请求头的一层封装,它的值和原始 HTTP 请求头中的完全一致,转换规则为:

$http_ + strings.lower_case(xxxx) = headers['xxxx']

1. header 比较判断

不用额外的插件支持,Nginx 原生就支持判断 Header,这里有两种情况会用到,分别是:

1.1 判断是否有特定 Header

这个会很简单,直接用 http_ 的前缀然后加上 header 的小写即可,例如:

  1. [root@liqiang.io]# cat nginx.conf
  2. if ($http_x_custom_header) {
  3. return 403;
  4. }

1.2 判断 Header 的值

另外一种就是判断指定 Header 的值是否是期望的值,其实也比较简单,就是在前面的基础上增加一个判断:

  1. [root@liqiang.io]# cat nginx.conf
  2. if ($http_user_agent != "rest-http-client/1.1") {
  3. return 403;
  4. }

2. host 和 http_host header 区别

重写 URL

  1. [root@liqiang.io]# cat /etc/nginx/nginx.conf
  2. location /telegram/bot {
  3. rewrite ^/telegram/bot(.*)$ $1 break;
  4. proxy_pass http://127.0.0.1:3000;
  5. proxy_set_header Host $host;
  6. proxy_set_header X-Real-IP $remote_addr;
  7. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  8. }

3. Ref