1 前言
笔者一个项目中需要完成一个带有安全认证的反向代理,整个测试进入最后阶段是如何在Nginx的服务器端正确地标识唯一用户,项目相关文章请参阅,
https://www.cmdschool.org/archives/1996
正是因为这样,笔者才通过研究“ngx_http_userid_module”模块且写下此文并分享。
2 基础知识
2.1 模块的介绍
– “ngx_http_userid_module”模块会设置一个客户端的唯一标识(Cookie)
– 接收和设置该唯一标识可使用嵌入式变量$uid_got和$uid_set
– 该模块与Apache的mod_uid模块兼容
2.2 使用范例
userid on; userid_name uid; userid_domain example.com; userid_path /; userid_expires 365d; userid_p3p 'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';
2.3 具体指令
2.3.1 用户唯一标识的启用或禁用
语 法: userid on | v1 | log | off; 默认值: userid off; 上下文: http, server, location
– on,表示启用用户唯一标识功能(使用版本2的cookies记录接收到的cookies)
– v1,表示使用版本1的cookies记录接收到的cookies
– log,表示禁用cookies的设置但启用记录接收到的cookies
– off,表示禁用cookies的设置和记录收到的cookies
2.3.2 定义唯一标识的域
语 法: userid_domain name | none; 默认值: userid_domain none; 上下文: http, server, location
– name,代表唯一标识(cookies)的域名称
– none,代表禁用cookie的域设置
2.3.3 定义唯一标识的域
语 法: userid_expires time | max | off; 默认值: userid_expires off; 上下文: http, server, location
– time,代表浏览器保存cookie的时间
– max,代表cookie的过期时间(例如,31 Dec 2037 23:55:55 GMT)
– off,表示cookie在浏览器会话结束时过期
2.3.4 使用标记
语 法: userid_mark letter | digit | = | off; 默认值: userid_mark off; 上下文: http, server, location
– 如果参数为关闭,则启用cookie标记机制并设置标记字符
– 机制将保留客户端标识符的同时添加或更改userid_p3p和/或者cookie过期时间
– 标记可以是英文字母(区分大小写)或数字或“=”字符
– 标记被设置则与cookie中传递的客户端标识(base64形式)的第一个符号进行比较
– 不匹配则重新发送标记、过期时间和“P3P”头
2.3.5 设置cookie名称
语 法: userid_name name; 默认值: userid_name uid; 上下文: http, server, location
– name,代表cookie的名称
2.3.6 设置P3P头
语 法: userid_p3p string | none; 默认值: userid_p3p none; 上下文: http, server, location
– 设置与Cookie一起发送的“P3P”标题字段的值
– none,代表“P3P”头将不在响应中发送
2.3.7 定义cookie的路径
语 法: userid_path path; 默认值: userid_path /; 上下文: http, server, location
– 定义cookie的路径
2.3.8 定义服务器编号
语 法: userid_service number; 默认值: userid_service IP address of the server; 上下文: http, server, location
– 该参数用于多服务器环境下确保客户端标识唯一
– 版本1的cookie的默认值是零
– 版本2的cookie的默认值是服务器IP地址的最后四字节组成的数字
2.4 环境变量
2.4.1 客户端标识符
$uid_got
Cookie的名称和收到的客户端标识符
2.4.2 重置客户端标识
$uid_reset
– 该变量被设置为非“0”的非空字符,则客户端标识符将被重置
– 特殊值“log”将会导致重置标识符的消息输出error_log
2.4.3 设置客户端标识
$uid_set
Cookie的名称和发送的客户端标识符
3 实践部分
3.1 搭建实践环境
请按照以下链接搭建测试环境,
https://www.cmdschool.org/archives/1996
3.2 增加带身份标识的配置
proxy_cache_path /data/nginx/cache/one levels=2:2:2 keys_zone=one:10m inactive=24h max_size=1g; server { listen 80; server_name www.cmdschool.org; userid on; userid_name uid; userid_domain www.cmdschool.org; userid_path /; userid_expires 1d; userid_p3p 'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"'; #userid_flags secure httponly; set $auth 0; if ($uid_got){set $auth 1;} location / { auth_request /auth; if ($auth = 0){return 301 https://$server_name$request_uri;} root /var/www/www.cmdschool.org; index index.html index.htm; } location = /auth { proxy_pass http://auth.cmdschool.org/httpBasicAuth.php; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; proxy_cache one; proxy_cache_valid 200 1m; proxy_cache_valid 403 3s; proxy_cache_key $uid_got; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
3.3 重启服务使配置生效
systemctl restart nginx
参阅文档:
=====================
模块的官方文档
——————-
http://nginx.org/en/docs/http/ngx_http_userid_module.html
模块的GIT文档
——————-
https://github.com/swiftype/web_server_uid
如何保持客户端cookie
——————-
https://blog.csdn.net/shimiso/article/details/39033353
没有评论