不知不觉 nginx主题的文章写了60+篇,有最早的也有最近的,有些是记录安装配置,有些是记录问题解决方法,内容质量有深也有浅参差不齐,随着技术迭代有些文章已经过时了(例如Docker时代)不再符合当前的技术需求,而有些文章虽然久远但是仍有有意义(例如Nginx HA),所以有了梳理这些文章的想法,目标有两个吧,一是回顾下过去的文章巩固下知识点,二是去其糟粕留下精华将有价值的文章搬迁(搬砖)的微信公众号。
壹
今天的这篇文章发布于2016年01月,是介绍如何在 nginx中如何借用set指令实现 if逻辑运算功能(如 True and True),这里借助set指令实现而不是直接在if表达式中加入 &&或者||运算符,是因为nginx的if指令不支持条件的"逻辑与"和"逻辑或"运算符,并且nginx不支持if嵌套形式条件判断。所以需要"曲线救国"来完成目标任务,此外文章除set指令外还涉return指令与if指令配合使用。
贰
下面的示例要完成的目标有两个
1. 使用nginx $http_user_agent, $uri 变量 结合if 语句,完成多重条件判断。 2. 对应用场景,示例恶意post行为返回405状态码。 配置文件
cat /etc/nginx/conf.d/default.conf server { #... 其它配置项省略 # 设置变量为空字符串 set $black ''; # 条件1 if ($http_user_agent ~* "(compatible; MSIE 9.0; Windows NT 6.1)") { set $black "${black}1"; } # 条件2 if ($uri ~* "/tools/sendSms" ) { set $black "${black}1"; } # 条件3 "逻辑与"为变量叠加的形式,既条件为真设置值为1. if ($request_method = POST) { set $black "${black}1"; } # 条件3 "逻辑或",如任意一个条件为假设置值为0. if ($request_method != POST) { set $black "${black}0"; } # 叠加后的变量值,"逻辑与"111,"逻辑或"110. if ($black = "111") { return 405; } }
叁
验证下结果
# 使用POST方法,服务器返回 405 状态。
curl -LI -X "POST" -A "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "http://localhost/tools/sendSms?type=mobilephone&mobilephone=1597XXXXX06" HTTP/1.1 405 Not Allowed Server: nginx 省略....
# 其它方法(GET/HEAD),服务器返回 200状态。
curl -LI -A "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "http://localhost/tools/sendSms?type=mobilephone&mobilephone=1597XXXXX06" HTTP/1.1 200 OK Server: nginx 省略....
肆
指令使用方法 1. return 指令
语法:return code 默认值:none 使用字段:server, location, if 这个指令结束执行配置语句并为客户端返回状态代码,可以使用下列的值: 204,400,402-406,408,410, 411, 413, 416与500-504。 此外,非标准代码444将关闭连接并且不发送任何的头部。
2. set 指令
语法:set variable value 默认值:none 使用字段:server, location, if 指令设置一个变量并为其赋值,其值可以是文本,变量和它们的组合。 你可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部变量的值
3. if 指令
请参考这篇文章 <<Nginx Rewrite 重写URI>>
本期搬砖就到这里下期再搬
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有