NGINX userid 分析、解码
NGINX userid 分析、解码 生成userid的代码在 http/modules/ngx_http_userid_filter_module.c 大概550行左右。
uid_set 是4个uint32构成的,其中比较有用的是第二个unit32,是userid的生成时间。第四个是一个递增值 以 0x03030302 为初始值,每次递增0x100。 default: /* AF_INET */
sin = (struct sockaddr_in *) c->local_sockaddr;
ctx->uid_set[] = sin->sin_addr.s_addr;
break;
} } else {
ctx->uid_set[] = htonl(conf->service);
} ctx->uid_set[] = htonl((uint32_t) ngx_time());
ctx->uid_set[] = htonl(start_value);
ctx->uid_set[] = htonl(sequencer_v2);
sequencer_v2 += 0x100;
if (sequencer_v2 < 0x03030302) {
sequencer_v2 = 0x03030302;
}
// 用PHP解码nginx userid
$str = $_REQUEST["uid"] ?: $_COOKIE['uid']; function nginx_userid_decode($str)
{
return unpack('N*', base64_decode(str_replace(' ', '+', $str)));
} $hash = nginx_userid_decode($str);
var_dump($hash);
date_default_timezone_set("UTC");
var_dump(date("Y-m-d H:i:s", $hash[]));
参考文章:
http://www.lsproc.com/blog/nginx_userid_decode/
————————————————————————————————————————————————————
1. 提取整个的Cookies内容到一个变量,然后可以在需要时引用,比如记录到日志里面,
if ( $http_cookie ~* "(.*)$") {
set $all_cookie $1;
}
变量$all_cookie就获得了cookie的值,可以用于运算了
2. 提取指定的一个cookie的值,然后根据需要使用,比如赋值给X-Real-Ip,
if ( $http_cookie ~* "pass_ip=(.+)(?:;|$)" ) {
set $one_cookie $1;
}
变量$one_cookie就获得了键值为pass_ip的这条cookie的值,可以用于运算了
3. 在proxy/fcgi等场景给Cookies增加内容,比如告诉后端你是那一台front。
proxy_set_header Cookie "$http_cookie; node_id=018"
- 文字
这里增加了名为node_id的一个cookie进去,当然,就这个例子来说,也可以这样传递前端的ID给backend:
proxy_set_header X-CDN-ID "018";
后端通过$_SERVER['HTTP_X_CDN_ID']就可以获取到赋值。
摘自:http://www.lc365.net/blog/b/24592/
————————————————————————————————————————————————————————————————————————————
自己接合自己的情况实践了一下:
- set $flag 0;
- set $userid 0; #登录用户的id作为cookie值放cookie了。
- ......
- location ~ .*\.(php|php5)?$
- { #实现Https访问博文及非主页面的列表下用Ctrl+F5删除前台用户访问的缓存文件
- if ( $request_uri ~* "^/post/([0-9]+)/?([0-9]+)?/?([0-9]+)?/?$" ) #如URL转写后请求到博文及列表(不包括主页及后台管理功能)是条件1。
- {
- set $flag "${flag}1";
- }
- if ($http_Cache_Control ~ "no-cache") #如果是上面博文连接且用了Ctrl+F5是条件2,实现删除生成的缓存文件,前端用户访问到最新更新博文页面。
- {
- set $flag "${flag}1";
- }
- if ($flag = "011"){
- rewrite ^(.*)$ /purge$1 last;
- }
- fastcgi_pass unix:/tmp/php-cgi.sock;
- fastcgi_index index.php;
- include fastcgi.conf;
- }
delcache.php
- <?php
- //https://justwinit.cn/post/4082/
- header("Content-type: text/html; charset=utf-8");
- function purgeCache()
- {
- $cacheRoot = "/data/cache/ngx_fcgi_cache";
- $url = "GET://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
- if (emptyempty($_SERVER["HTTP_HOST"])||emptyempty($_SERVER["REQUEST_URI"])){
- die('请输入正确的URL,检查Host参数入及URI参数是否正确。');
- }
- $md5 = md5($url);
- $cacheFile = $cacheRoot . '/' . substr($md5, -1, 1) . '/' . substr($md5, -3, 2) . '/' . $md5;
- //echo $url."<br>";
- //echo $cacheFile."<br>";
- if (!file_exists($cacheFile)) {
- //echo ('缓存不存在。');
- }
- if (@unlink($cacheFile)) {
- //echo '清除缓存成功。';
- } else {
- //echo '清除缓存失败。';
- }
- //file_put_contents("/tmp/jack.txt",var_export($_SERVER,True) ,FILE_APPEND);
- if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on"){//兼容访问时来自Https的情况:http访问时没有$_SERVER["HTTPS"]变量。
- $url = "https://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
- }elseif(isset($_COOKIE['userpsw'])&&isset($_COOKIE['userid'])){//兼容是管理员登录后有Cookie时,访问转走Https,无缓存。
- $url = "https://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
- }
- else{
- $url = "http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
- }
- flush();
- ob_clean();
- //header("location:".$url);//防止多次循环跳转,采用前端跳转。
- echo "<meta http-equiv='refresh' content='0;url=$url' />";
- exit;
- }
- purgeCache()
- ?>
NGINX userid 分析、解码的更多相关文章
- nginx日志分析利器GoAccess
面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记 ...
- nginx日志分析利器GoAccess(转)
面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记 ...
- ELK+redis搭建nginx日志分析平台
ELK+redis搭建nginx日志分析平台发表于 2015-08-19 | 分类于 Linux/Unix | ELK简介ELKStack即Elasticsearch + Logstas ...
- 使用elk+redis搭建nginx日志分析平台
elk+redis 搭建nginx日志分析平台 logstash,elasticsearch,kibana 怎么进行nginx的日志分析呢?首先,架构方面,nginx是有日志文件的,它的每个请求的状态 ...
- 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t
新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
- 新秀nginx源代码分析数据结构篇(两) 双链表ngx_queue_t
nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...
- Nginx日志分析及脚本编写
在我们日常的运维中,当Nginx服务器正常运行后,我们会经常密切关注Nginx访问日志的相关情况,发现有异常的日志信息需要进行及时处理. 那今天我将跟大家一起来研究和分析Nginx日志,nginx默认 ...
- Nginx源代码分析—业务流程
Nginx源代码分析-业务流程 到此为止,我们如果ngx_init_cycle已经结束.我们临时无论他做了什么,我们从他做的效果进入. 从常理上来讲,假设一个请求到达,那么我们须要接受这个请求,那么就 ...
- nginx高性能WEB服务器系列之八--nginx日志分析与切割
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
随机推荐
- 第二十二课:js事件原理以及addEvent.js的详解
再看这篇博客之前,希望你已经对js高级程序编程一书中的事件模块进行了详读,不然我只能呵呵了. document.createEventObject,在IE下创建事件对象event. elem.fire ...
- Mysql 调优小技巧
MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...
- Qt无边框,可移动窗口
QPoint dragPosition; void MainWindow::mousePressEvent(QMouseEvent *event) { if(event->button()==Q ...
- Java基础-CGLIB动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继 ...
- jQuery Select的操作集合
1. $("#select_id").change(function(){... }); //为select添加事件,当选择其中一项时触发2. $("#select_ ...
- SQL Server 2008 R2导出数据脚本的方法
以前看到有些朋友说必须SQL Server 2008才能导出包含数据的脚本,后来仔细研究发现其实SQL Server 2008 R2也是可以的,只需在导出的时候在高级中设置一下即可. 1.首先在数据库 ...
- 德州扑克AI WEB版
继续之前的德州扑克话题,上次的DOS界面确实没法看,我女朋友说这是什么鬼.哈哈,估计只有自己能玩了 这两天重构了一下界面,基于web服务器和浏览器来交互. 服务器和客户端之间用websocket通信, ...
- WebView 自定义错误界面,WebView 加载进度条,和Logding 效果
---恢复内容开始--- 下载地址,代码就不粘贴了 http://pan.baidu.com/s/1eQncg86 ---恢复内容结束--- 我没有判断是不是网络原因,各位自行判断吧,图片错误信息,及 ...
- 使用servletAPI三种方式简单示例
一.直接实现Action接口或集成ActionSupport类(推荐) public class HelloAction implements Action { @Override public St ...
- tomcat管理页面用户角色、用户名、用户密码的配置
参考资料:http://www.365mini.com/page/tomcat-manager-user-configuration.htm 编辑tomcat/conf/tomcat-users.xm ...