nginx的http模块开发--一个验证url参数的例子
location为/mysecret的时候,需要传递值为secretpassword的mysecret参数。页面会返回200并显示secret right,否则页面返回200并显示secret wrong。
配置文件这里有几个地方注意下:
为了调试方便,调整了几个地方:
./configure --add-module=/home/yejianfeng/nginx/nginx_module/mysecret2/ --prefix=/home/yejianfeng/nginx/nginx/ --with-debug
完整的代码可以看:https://github.com/jianfengye/MyWorks/tree/master/nginx_module_mysecret
有几个地方要说明:
1 这个模块由于有从配置文件中读取的信息,所以它是有属于自己模块的配置文件结构的
所以有自己的配置文件,那么在模块构造模块上下文的时候create_loc_conf的阶段就多一个功能是初始化配置文件结构
// 定义上下文, 只会在location中出现,所以都为null
static ngx_http_module_t ngx_http_mysecret_module_ctx = {
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
ngx_http_mysecret_create_loc_conf, //这里有使用自己的配置结构
NULL
};
其中ngx_http_mysecret_create_loc_conf只要做的事情是初始化配置文件
2 如何将配置文件nginx.conf中的mysecret的一个参数放在配置文件结构中呢?
在ngx_http_mysecret这个命令回调函数中,有个ngx_conf_set_str_slot,这个是nginx预设的14个读取配置文件的函数之一,调用它就可以把nginx.conf中的secrect秘钥读取到配置文件结构中了。
3 在handler中怎么获取配置文件结构呢?
现在读取配置文件结束了,也构造了配置文件结构,到具体的处理http请求的阶段,如何获取这个结构呢?
使用这个方法就能在handler中获取到自定义的配置文件结构了。
获取配置结构后,后面的问题就是如何获取请求参数呢
ngx_http_request_t中的args参数就是获取请求参数的
比如http://abc.com?a=s b=2 那么args就是ngx_string("a=s b=2")
后面就可以使用nginx自定义的ngx_strncasecmp进行字符比较等操作了。
好了,完整的一个验证请求参数的模块就写完了。
有人会对nginx.conf文件有点不舒服,可能希望设置验证秘钥是分为两个步骤:
设置秘钥和验证秘钥
即配置文件大致变成现在的样子:
原来的mysecret被两个命令setmysecret和checksecret替换了
这两个命令的功能其实是不一样的,setmysecret只是读取配置文件,并不会对请求做任何操作,而checksecret是直接修改请求的。
其实上一个例子稍微改一改就可以达到这样的目的:
https://github.com/jianfengye/MyWorks/tree/master/nginx_module_mysecret2
定义模块命令的结构就变成:
这里的setmysecret直接使用nginx预设的ngx_conf_set_str_slot方法,它就不需要有任何定义handler的操作了。事实上,nginx很多模块的像setmysecret这样的读取配置文件的命令(不做任何http请求的操作)都是直接使用nginx预设的14种方法的。具体的使用在《深入理解Nginx》第四章中有详细说明了。
自然在checksecret命令中就不需要再读取参数了(也没有参数了,所以要注意这个命令中的命令类型要设置上NGX_CONF_NOARGS)
相关文章
- 第二章·Nginx常用基础模块
- 河南计算机职称考试模块选择,2016职称计算机考试模块Dreamweaver选择冲刺题1
- 2-ESP8266转CAN总线和RS232通讯模块-CAN总线通信测试Arduino
- Nginx 配置中nginx和alias的区别分析
- 7.Nginx实践之使用Lua-nginx模块脚本连接Redis数据库读取静态资源并隐式展现
- ansible之copy模块
- sdio接口wifi模块_连接路由器的用哪个接口
- 树莓派三代相机模块上线-IMX708
- Nginx手册:Gzip压缩模块详解
- 为Nginx开启SSI模块以支持SHTML解析
- Python:numpy模块最详细的教程
- NGINX rewrite模块的笔记
- 【Maven】分模块开发与设计与依赖管理
- AI智慧城市EasyCVR视频融合平台视频调阅模块一键播放功能的优化
- 【Android 逆向】Android 逆向通用工具开发 ( 网络模块开发 | 配置头文件 | 配置编译参数 | 网络初始化 WSAStartup 与清理 WSACleanup 操作 )
- Nginx的nginx.conf配置文件中文注释说明详解程序员
- Centos下yum安装Nginx报错 No package nginx available.详解程序员
- Python traceback 模块, 打印异常信息详解编程语言
- 状态Linux查看Nginx服务状态的简单方法(linux查看nginx)
- Linux下Nginx安装使用详细指南(linux安装nginx详细教程)
- Linux下启动Nginx服务的简易步骤(linux启动nginx)
- 开启Oracle数据库之旅:探索模块的优势.(oracle模块)
- Linux下如何快速删除Nginx(linux删除nginx)
- SpaceVim – 开箱即用的Vim-IDE,用户仅需载入相关语言的模块即可得到一个开箱即用的Vim-IDE。
- 淘宝开发:Nginx经典模块(Nginx+Http+Footer+Filter)
- nginx秒杀科技Redis与Nginx结合的方案(秒杀技术方案redis和)
- Redis优势助力Nginx提速(redis读nginx)
- 跟老齐学Python之模块的加载