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/

[实践OK]Nginx 配置文件中处理Cookies的例子 nginx cookie  

justwinit 2014-11-1 15:32   |  |   



背景:在nginx用缓存插件时,个人博客如果在登录态时访问首页还是会缓存,自己登录后是用https管理,但是经常访问是http的,访问的是缓存的页面,自己不能得知自己是否已经登录上了的同时,也没法看自己的更多隐藏并置顶的博文,在这儿,发出能通过nginx处理Cookies实现是否读取缓存,当发现有这个cookie时,调用删除缓存接口删除掉同时跳转到后端https管理页面,进而解决了该问题。
————————————————————————————————————————————————————

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"

  1. 文字

这里增加了名为node_id的一个cookie进去,当然,就这个例子来说,也可以这样传递前端的ID给backend:
proxy_set_header X-CDN-ID "018";
     后端通过$_SERVER['HTTP_X_CDN_ID']就可以获取到赋值。

摘自:http://www.lc365.net/blog/b/24592/
————————————————————————————————————————————————————————————————————————————
自己接合自己的情况实践了一下:

  1. set $flag 0;
  2. set $userid 0; #登录用户的id作为cookie值放cookie了。
  3. ......
  4. location ~ .*\.(php|php5)?$
  5. {   #实现Https访问博文及非主页面的列表下用Ctrl+F5删除前台用户访问的缓存文件
  6. if ( $request_uri ~* "^/post/([0-9]+)/?([0-9]+)?/?([0-9]+)?/?$" ) #如URL转写后请求到博文及列表(不包括主页及后台管理功能)是条件1。
  7. {
  8. set $flag "${flag}1";
  9. }
  10. if ($http_Cache_Control ~ "no-cache") #如果是上面博文连接且用了Ctrl+F5是条件2,实现删除生成的缓存文件,前端用户访问到最新更新博文页面。
  11. {
  12. set $flag "${flag}1";
  13. }
  14. if ($flag = "011"){
  15. rewrite ^(.*)$ /purge$1 last;
  16. }
  17. fastcgi_pass  unix:/tmp/php-cgi.sock;
  18. fastcgi_index index.php;
  19. include fastcgi.conf;
  20. }

delcache.php

  1. <?php
  2. //https://justwinit.cn/post/4082/
  3. header("Content-type: text/html; charset=utf-8");
  4. function purgeCache()
  5. {
  6. $cacheRoot = "/data/cache/ngx_fcgi_cache";
  7. $url =  "GET://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
  8. if (emptyempty($_SERVER["HTTP_HOST"])||emptyempty($_SERVER["REQUEST_URI"])){
  9. die('请输入正确的URL,检查Host参数入及URI参数是否正确。');
  10. }
  11. $md5 = md5($url);
  12. $cacheFile = $cacheRoot . '/' . substr($md5, -1, 1) . '/' . substr($md5, -3, 2) . '/' . $md5;
  13. //echo $url."<br>";
  14. //echo $cacheFile."<br>";
  15. if (!file_exists($cacheFile)) {
  16. //echo ('缓存不存在。');
  17. }
  18. if (@unlink($cacheFile)) {
  19. //echo '清除缓存成功。';
  20. } else {
  21. //echo '清除缓存失败。';
  22. }
  23. //file_put_contents("/tmp/jack.txt",var_export($_SERVER,True) ,FILE_APPEND);
  24. if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on"){//兼容访问时来自Https的情况:http访问时没有$_SERVER["HTTPS"]变量。
  25. $url = "https://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
  26. }elseif(isset($_COOKIE['userpsw'])&&isset($_COOKIE['userid'])){//兼容是管理员登录后有Cookie时,访问转走Https,无缓存。
  27. $url = "https://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
  28. }
  29. else{
  30. $url = "http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
  31. }
  32. flush();
  33. ob_clean();
  34. //header("location:".$url);//防止多次循环跳转,采用前端跳转。
  35. echo "<meta http-equiv='refresh' content='0;url=$url' />";
  36. exit;
  37. }
  38. purgeCache()
  39. ?>

 

NGINX userid 分析、解码的更多相关文章

  1. nginx日志分析利器GoAccess

    面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记 ...

  2. nginx日志分析利器GoAccess(转)

    面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记 ...

  3. ELK+redis搭建nginx日志分析平台

    ELK+redis搭建nginx日志分析平台发表于 2015-08-19   |   分类于 Linux/Unix   |  ELK简介ELKStack即Elasticsearch + Logstas ...

  4. 使用elk+redis搭建nginx日志分析平台

    elk+redis 搭建nginx日志分析平台 logstash,elasticsearch,kibana 怎么进行nginx的日志分析呢?首先,架构方面,nginx是有日志文件的,它的每个请求的状态 ...

  5. 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t

    新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...

  6. 新秀nginx源代码分析数据结构篇(两) 双链表ngx_queue_t

    nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...

  7. Nginx日志分析及脚本编写

    在我们日常的运维中,当Nginx服务器正常运行后,我们会经常密切关注Nginx访问日志的相关情况,发现有异常的日志信息需要进行及时处理. 那今天我将跟大家一起来研究和分析Nginx日志,nginx默认 ...

  8. Nginx源代码分析—业务流程

    Nginx源代码分析-业务流程 到此为止,我们如果ngx_init_cycle已经结束.我们临时无论他做了什么,我们从他做的效果进入. 从常理上来讲,假设一个请求到达,那么我们须要接受这个请求,那么就 ...

  9. nginx高性能WEB服务器系列之八--nginx日志分析与切割

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

随机推荐

  1. DOM系列---DOM操作样式

    发文不易,若转载传播,请亲注明出处,谢谢! 一.操作样式 CSS作为(X)HTML的辅助,可以增强页面的显示效果.但不是每个浏览器都能支持最新的CSS能力.CSS的能力和DOM级别密切相关,所以我们有 ...

  2. 第二章:javascript: 数组

    数组是编程世界里最常见的数据结构.任何一种编程语言都包含数组,只是形式稍微有差异.数组是编程语言中的内建类型,通常效率都很高.可以满足不同需求的数据存储,本章将探索javascript中的数组工作原理 ...

  3. searchBar控件

    那就先了解一下UISearchBar控件吧! UISearchBar控件就是要为你完成搜索功能的一个专用控件.它集成了很多你意想不到的功能和特点! 首先,还是来普及一下UISearchBar控件API ...

  4. 【ELK Stack】ELK+KafKa开发集群环境搭建

    部署视图 运行环境 CentOS 6.7 x64 (2核4G,硬盘100G) 需要的安装包 Runtime jdk1.8 : jdk-8u91-linux-x64.gz (http://www.ora ...

  5. WPF小知识,MessageBox的多种用法

    我们在程序中经常会用到MessageBox. 现将其常见用法总结如下: 1.MessageBox.Show("Hello~~~~"); 最简单的,只显示提示信息. 2.Messag ...

  6. .net架构设计读书笔记--第二章 设计体系结构

    第五节 探索领域架构 一.领域驱动设计的价值与意义 最初在java中使用,.net要晚些才引入.领域驱动设计出现之初的争议.一个向导,少走弯路   1. 我们真的需要DDD吗? DDD并不适用于每个软 ...

  7. Tomcat 使用说明

    Tomcat下有7个目录,分别是bin,conf,lib,logs,temp,webapps,work 目录 Tomcat根目录在tomcat中叫<CATALINA_HOME> 1.< ...

  8. ORACLE在存储过程中记录日志的处理包

    Java开发过程中一般使用LOG4J来将程序的运行日志记录到文件中,在ORACLE存储过程中也需要记录日志,我将工作中自己整理的一个记录日志的包分享出来,其实很简单,希望大家多提意见. 一.表结构 为 ...

  9. Oracle常用sql

    Oracle不像Sqlserver,并没有提供l默认约束,但提供了默认值,效果一样.--------------------------- 在建表时设置默认约束-------------------- ...

  10. BZOJ-1206 虚拟内存 Hash+离散化+Priority_Queue

    闻说HNOI每年都有一道Hash. 1206: [HNOI2005]虚拟内存 Time Limit: 50 Sec Memory Limit: 162 MB Submit: 330 Solved: 2 ...