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 的小写即可,例如:
[root@liqiang.io]# cat nginx.conf
if ($http_x_custom_header) {
return 403;
}
1.2 判断 Header 的值
另外一种就是判断指定 Header 的值是否是期望的值,其实也比较简单,就是在前面的基础上增加一个判断:
[root@liqiang.io]# cat nginx.conf
if ($http_user_agent != "rest-http-client/1.1") {
return 403;
}
2. host 和 http_host header 区别
- host:
- 如果 http 请求中包含 Host 请求头,那么 host 就等于 headers[“Host”];
- 如果 Host 里面包含 port(例如:localhost:9090),host 的值不会有 port,所以 host=localhost
- 如果 http 请求中不包含 Host 请求头,那么 host 就等于运行该 nginx 的 hostname;
- 如果 http 请求中包含 Host 请求头,那么 host 就等于 headers[“Host”];
- http_host:
- 其实是 Nginx 对原始请求头中的 Host 的包装,所以完全等价于 headers[“Host”]
重写 URL
[root@liqiang.io]# cat /etc/nginx/nginx.conf
location /telegram/bot {
rewrite ^/telegram/bot(.*)$ $1 break;
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}