Skip to content

Nginx用户cookie模块

用户 cookie 模块(ngx_http_userid_module)的作用是为客户端设置 cookie 以标识不同的访问用户。可以通过内部变量 $uid_got 和 $uid_set 记录已接收和设置的 cookie。该模块的内置配置指令如下面表格中所示。

表:用户cookie指令

<tbody>
	<tr>
		<th>名称</th>
		<th>用户 cookie 指令</th>
	</tr>
	<tr>
		<td>指令</td>
		<td>userid</td>
	</tr>
	<tr>
		<td>作用域</td>
		<td>http、server、location</td>
	</tr>
	<tr>
		<td>默认值</td>
		<td>off</td>
	</tr>
	<tr>
		<td>指令值可选项</td>
		<td>on、off、v1 或 log</td>
	</tr>
	<tr>
		<td>指令说明</td>
		<td>设置关闭或启用用户 cookie 及启用的方式</td>
	</tr>
</tbody>

当指令值为 off 时,关闭用户 cookie 接收和记录功能。

当指令值为 on 时,启用用户 cookie 接收和记录功能,默认为 v2 版本设置 cookie。设置 cookie 的响应头标识为 Set-Cookie2。

当指令值为 v1 时,使用 v1 版本设置 cookie,设置 cookie 的响应头标识为 Set-Cookie。

当指令值为 log 时,不设置用户 cookie,但对接收到的 cookie 进行记录。

<tbody>
	<tr>
		<th>名称</th>
		<th>用户 cookie 域指令</th>
	</tr>
	<tr>
		<td>指令</td>
		<td>userid_domain</td>
	</tr>
	<tr>
		<td>作用域</td>
		<td>http, server, location</td>
	</tr>
	<tr>
		<td>默认值</td>
		<td>none</td>
	</tr>
	<tr>
		<td>指令说明</td>
		<td>设置用户 cookie 中的域名,none 表示禁用 cookie 的域设置</td>
	</tr>
</tbody>
<tbody>
	<tr>
		<th>名称</th>
		<th>用户 cookie 过期指令</th>
	</tr>
	<tr>
		<td>指令</td>
		<td>userid_expires</td>
	</tr>
	<tr>
		<td>作用域</td>
		<td>http, server, location</td>
	</tr>
	<tr>
		<td>默认值</td>
		<td>off</td>
	</tr>
	<tr>
		<td>指令值可选项</td>
		<td>time 或 max 或 off</td>
	</tr>
	<tr>
		<td>指令说明</td>
		<td>设置用户 cookie 的过期时间,time 表示客户端保存 cookie 的时间,max 表示 cookie 的过期时间,默认为会话结束即过期</td>
	</tr>
</tbody>
<tbody>
	<tr>
		<th>名称</th>
		<th>用户 cookie 标识指令</th>
	</tr>
	<tr>
		<td>指令</td>
		<td>userid_mark</td>
	</tr>
	<tr>
		<td>作用域</td>
		<td>http, server, location</td>
	</tr>
	<tr>
		<td>默认值</td>
		<td>off</td>
	</tr>
	<tr>
		<td>指令值可选项</td>
		<td>letter 或 digit 或 = 或 off</td>
	</tr>
	<tr>
		<td>指令说明</td>
		<td>设置用户 cookie 的标识机制并设置用作标记的字符。该标识机制用于在保存客户标识符的同时添加或修改 userid_p3p 及 cookie 的过期时间</td>
	</tr>
</tbody>

用作标记的指令值可以是任意英文字母(区分大小写)、数字或"="。

userid_mark 设置完成后,将与用户 cookie 中传送的 Base64 格式的标识的第一个字符进行比较,如果不匹配,则重新发送用户标识、userid_p3p 及 cookie 的过期时间。

<tbody>
	<tr>
		<th>名称</th>
		<th>用户 cookie 名称指令</th>
	</tr>
	<tr>
		<td>指令</td>
		<td>userid_name</td>
	</tr>
	<tr>
		<td>作用域</td>
		<td>http, server, location</td>
	</tr>
	<tr>
		<td>默认值</td>
		<td>uid</td>
	</tr>
	<tr>
		<td>指令说明</td>
		<td>设置 cookie 名称</td>
	</tr>
</tbody>

表:用户 p3p 指令

<tbody>
	<tr>
		<th>名称</th>
		<th>用户 p3p 指令</th>
	</tr>
	<tr>
		<td>指令</td>
		<td>userid_p3p</td>
	</tr>
	<tr>
		<td>作用域</td>
		<td>http、server、location</td>
	</tr>
	<tr>
		<td>默认值</td>
		<td>none</td>
	</tr>
	<tr>
		<td>指令说明</td>
		<td>设置是否将 p3p 头属性字段同 cookie 一同发送</td>
	</tr>
</tbody>

P3P 是 W3C 推荐的隐私保护标准,P3P 头属性字段通常用于解决与支持 P3P 协议的浏览器的跨域访问问题。

<tbody>
	<tr>
		<th>名称</th>
		<th>用户 cookie 路径指令</th>
	</tr>
	<tr>
		<td>指令</td>
		<td>userid_path</td>
	</tr>
	<tr>
		<td>作用域</td>
		<td>http, server, location</td>
	</tr>
	<tr>
		<td>默认值</td>
		<td>--</td>
	</tr>
	<tr>
		<td>指令说明</td>
		<td>设置 cookie 路径</td>
	</tr>
</tbody>
<tbody>
	<tr>
		<th width="60px">
			名称 </th>
		<th>用户 cookie 源服务器指令</th>
	</tr>
	<tr>
		<td>指令</td>
		<td>userid_service</td>
	</tr>
	<tr>
		<td>作用域</td>
		<td>http, server, location</td>
	</tr>
	<tr>
		<td>默认值</td>
		<td>--</td>
	</tr>
	<tr>
		<td>指令说明</td>
		<td>设置 cookie 的发布服务器。当 cookie 标识符由多个服务器发出时,为确保用户标识的唯一性,则应为每个服务器分配编号,cookie 版本 1 时默认为 0,cookie 版本 2 时默认为服务器 IP 地址的最后 4 个八位字节组成的数字</td>
	</tr>
</tbody>

配置样例如下:

server {

listen 8083;

server_name example.com;

root /opt/nginx-web;

auth_request /auth;

userid         on;

userid_name    uid;

userid_domain  example.com;

userid_path    /;

userid_expires 1d;

userid_p3p     'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';

location / {

index  index.html index.htm;

add_header    Set-Cookie "username=$remote_user";

}

location /auth {

proxy_pass_request_body off;

proxy_set_header Content-Length "";

proxy_set_header X-Original-URI $request_uri;

proxy_pass http://192.168.2.145:8080/HttpBasicAuth.php;

}

}