最近在尝试的用varnish,资料太少,偶然看见一个vcl的处理流程图,哪来分享下
### for postscript output
$ sed -n ‘/^DOT/s///p’ varnish-cache/bin/varnishd/cache_center.c | dot -Tps > /tmp/varnish-flow.ps
### for pdf output
$ sed -n ‘/^DOT/s///p’ varnish-cache/bin/varnishd/cache_center.c | dot -Tpdf > /tmp/varnish-flow.pdf

ajax只支持utf-8格式,不能支持gb2312编码格式,所以经常遇到gb2312的编码的程序使用ajax就出现乱码,刚找到一种解决方案是:
服务器端传送的数据仍是gb2312编码,客户端用js将汉字转变成utf8编码显示在页面
search.php
1
2
3
4
| <?php
header("Content-type: text/html; charset=gb2312");
include './search.htm';
?> |
search.htm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>高级搜索</title>
</head>
<body>
<h3>高级搜索</h3>
<form method="post" action="">
学校类型:
<select name="schooltype">
<option value="">全部</option>
<option value="1">小学</option>
<option value="2">初中</option>
</select>
学校名称:
<select name="sid" id="sid">
<option value="">请选择学校</option>
</select>
</form>
<script type="text/javascript">
function ajax(settings) {
var XHR = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(), successed = false;
XHR.open(settings.type, settings.url);
if(settings.type == 'post')
XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
XHR.send((!settings.cache ? 'time=' + new Date().getTime() + '&' : '') + settings.data);
settings.loader();
setTimeout(function() {
if(!successed) {
alert('Resquest timeout!');
XHR.abort();
}
}, settings.timeout);
XHR.onreadystatechange = function() {
if (XHR.readyState == 4 && XHR.status == 200) {
settings.callback(XHR.responseText.replace(/(^\s*)|(\s*$)/g, ""));
}
successed = true;
}
}
function a(t) {
ajax({
type: 'post',
url: 'ajax.php',
data: 'schooltype=' + t,
timeout: 8000,
cache: true,
loader: function() {},
callback: function(d) {
var arr = eval(d);
if(typeof(arr) == 'object') {
var obj, option;
document.getElementById('sid').innerHTML = '';
for(var i = 0; obj = arr; i ++) {
option = document.createElement('option');
option.value = obj[0];
option.innerHTML = txt2utf8(obj[1], '&#');
document.getElementById('sid').appendChild(option);
}
}
}
})
}
function txt2utf8(string, prefix){
for(var i=0,utf8=[];i<string.length;utf8.push((prefix||'\\u')+string.charCodeAt(i++)));
return utf8.join('');
}
a(0);
</script>
</body>
</html> |
ajax.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <?php
header("Content-type: text/html; charset=gb2312");
$schooltype = !empty($_POST['schooltype']) ? $_POST['schooltype'] : 0;
switch($schooltype) {
case 0:
echo "[['40', '太平溪镇花栗包完全小学'],['41', '太平溪镇长岭黑龙江希望小学'],['42', '乐天溪镇初级中学'],['43', '乐天溪镇莲沱初级中学']]";
break;
case 1:
echo "[['40', '太平溪镇花栗包完全小学'],['41', '太平溪镇长岭黑龙江希望小学']]";
break;
case 2:
echo "[['42', '乐天溪镇初级中学'],['43', '乐天溪镇莲沱初级中学']]";
break;
default:
break;
}
?> |
这个提到的方案有:
一,服务器端json数据用php的iconv函数转换:iconv(‘GB2312′, ‘UTF8′, “被转换字符串,输出到浏览器”);
客户端获取UTF8数据,再转成gb2312:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| function gb2utf8(data){//GB编码是,ie通过二进制码utf8->gbk转为中文
var glbEncode = [];
gb2utf8_data = data;
execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript");
var t=escape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g|>,"%$2%$1").replace(/%([A-Z].)%(.{2})/g|>,"@$1$2");
t=t.split("@");
var i=0,j=t.length,k;
while(++i<j)>
k=t.substring(0,4);
if(!glbEncode[k]) {
gb2utf8_char = eval("0x"+k);
execScript("gb2utf8_char = Chr(gb2utf8_char)", "VBScript");
glbEncode[k]=escape(gb2utf8_char).substring(1,6);
}
t=glbEncode[k]+t.substring(4);
}
gb2utf8_data = gb2utf8_char = null;
return unescape(t.join("%"));
} |
二,header(“Content-type”, “application/x-www-form-urlencoded; charset=GBK”); //输出头标,设置为GBK编码
三,在ajax请求数据前调用上面的方法指定请求使用的字符集:xmlHttp.setRequestHeader( “Content-Type”, “application/x-www-form-urlencoded;charset=gbk”);
防盗链技术现状:
1、通过识别Referer确认请求来源页面
2、Apache,squid等都能对Referer进行识别
3、通过ActiveX显示的内容不向服务器提供Referer Header(例如,Flash,WindowsMedia视频等)
4、流媒体的RTSP协议也不向服务器提供Referer Header
5、通过服务器端程序代码实现
防盗链应用现状:
1、对图片、HTML等可以实现防盗链
2、无法对Flash,WindowsMedia视频(MMS,RTSP)实现防盗链
3、服务器端程序代码实现的防盗链无法通过CDN加速
对于Flash,WindowsMedia视频这种占用流量较大的服务无法实现防盗链,对一个依靠这类内容作为盈利点的网站来说是非常头疼的,俺通过一些研究以及测试实现了采用Cookie技术的防盗链解决方案,完美的解决了对Flash,WindowsMedia视频的防盗链。
首先发现虽然ActiveX插件不传递Referer,但是却忠实的传递Cookie。于是在显示ActiveX的页面的
标签内嵌入一段代码:
这段代码用 javascript 设置了一段 Cookie: Cache=vod
然后通过各种ACL来判断这个Cookie的存在以及验证其值的操作了
Squid:
建立脚本 /usr/local/squid/libexec/squid_cookie.pl
———–
#!/usr/bin/perl -w
# programmed by oknet http://blog.sina.com.cn/m/oknet
# 这个脚本仅仅是验证了Cache这个cookie的存在,没有严格的校验其值。
# This is the cookie to check for.
$COOKIE=”Cache=”;
# disable output buffering
$|=1;
# cookie matches?
while () {
chop;
$cookie=$_;
if( $cookie =~ /$COOKIE/i) {
print “OK\n”;
} else { print “ERR\n”; }
}
———–
然后在squid.conf添加:
external_acl_type download children=15 %{Cookie} /usr/local/squid/libexec/squid_cookie.pl
acl dl external download
然后选择需要进行防盗链的文件类型:
acl filetype url_regex -i \.wmv
acl filetype url_regex -i \.wma
acl filetype url_regex -i \.asf
acl filetype url_regex -i \.asx
acl filetype url_regex -i \.avi
acl filetype url_regex -i \.mp3
acl filetype url_regex -i \.smi
acl filetype url_regex -i \.rm
acl filetype url_regex -i \.ram
acl filetype url_regex -i \.rmvb
acl filetype url_regex -i \.swf
acl filetype url_regex -i \.mpg
acl filetype url_regex -i \.mpeg
acl filetype url_regex -i \.mov
acl filetype url_regex -i \.zip
acl filetype url_regex -i \.mid
如果仅仅只是禁止用户访问的话,就没意思了,要让盗链者帮我们宣传我们的网站,特别是发现盗链比较多的时候,这个时候,可以让任何盗链的网站帮我们免费宣传~~~那就是把盗链的url重定向到我们的网站宣传页~~
建立脚本:/usr/local/squid/libexec/squid_redir.pl
————————–
#!/usr/bin/perl -T -w
#
# rredir.pl
#
# Author: Peter Eisenhauer
# First Version: 26. May 1997
# Modified by oknet http://blog.sina.com.cn/m/oknet
#
# Description: Direct all request to files who are in a local dir to
# this directory
#
use File::Basename;
use URI::URL;
# flush after every print
$| = 1;
# Process lines of the form ‘URL ip-address/fqdn ident method’
# See release notes of Squid 1.1 for details
while ( <> ) {
$r302=0;
($url, $addr, $fqdn, $ident, $method) = m:(\S*) (\S*)/(\S*) (\S*) (\S*):;
$url = url $url;
$host = lc($url->host);
if ( $host !~ /\./ ) {
next;
}
if ( $host =~ /vod\.domain\.com/ ) {
$url->path(“/ad.wmv”);
$r302=1;
}
} continue {
if ( $r302 ) {
print “302:$url\n”;
} else {
print “$url $addr/$fqdn $ident $method\n”;
}
}
————————–
然后在squid.conf添加:
redirect_program /usr/local/squid/libexec/squid_redir.pl
redirect_children 5
acl superurl url_regex -i ^http://vod\.domain\.com/tom\.wmv$
redirector_access deny superurl
redirector_access allow filetype !dl
redirector_access deny all
设置superurl是因为宣传我们自己站点的视频是不做防盗链的,这样才能起到宣传的作用。现在大功告成啦!网站的流量大幅增加~~~PV是原来的三倍,Oh,Yeah~
WMS视频的MMS协议由于不是明文,无法实现防盗链,但是RTSP协议基本就是HTTP协议的变种,可以在BIGIP等可以进行Layer 7处理数据的设备上实现对Cookie的校验。但是WMS视频防盗链要禁止MMS协议,因为MMS协议不是明文,无法进行cookies的识别。但是可以在HTTP,RTSP上进行识别,WMS V9都是支持HTTP,RTSP的。下面是用于BIGIP的防盗链iRule:
————————–
if (http_uri matches_regex “vod.domain.com”) {
if (http_cookie(“Cache”) == “vod”) {
use pool vod-rtsp
}
else {
discard
}
}
else {
use pool vod-rtsp
}
————————–
其他的系统可以参考以上的规则。
采用Cookie的防盗链方式对于大多数的系统都可以轻易实现,Cookie一般都是用来传递认证信息,相信不会出现不传递的状况。
转自:http://blog.sina.com.cn/s/blog_544465b00100034a.html
今天一个部门打电话来说文件传不上ftp,看了下提示是空间满了,结果扫描了下实际容量似乎没满,感觉是quota的识别容量错了。
说实话这pureftpd用的还很少在安装目录里面逛了圈发现了pure-quotacheck这个命令,应该就是了。
试了试使用格式如下:
/usr/local/pureftpd/sbin/pure-quotacheck -u www -d /www/aaa.com
-u 是你指定pure-quotacheck运行时以系统的什么用户去扫描
-d 就是你ftp站点的目录
VirtualBox的虚拟机克隆主要就是克隆一份vdi文件,今天在克隆一台VirtualBox的虚拟机时以为和vmware那样复制粘贴注册vdi的时候会提示copy it之类的,没想到直接报错uuid重复注册。翻了下帮助原来VirtualBox有转码的工具来进行vdi克隆。
在VirtualBox的安装目录下有个 VBoxManage.exe 其实这工具有蛮多功能,有兴趣的同学可以自己看看帮助。我们这里就说下如何克隆vdi了:
VBoxManage.exe clonevdi 原始VDI文件名 新的VDI文件名
其实蛮方便的一个工具想不懂为啥不做成图形的非得要敲命令呢,用户体验真差。
有个mysql的查询 用的 where xxx in ('a','b','c','d'),现在有一批数据需要放入in () 来查询,在想如何批量转换成'a','b','c','d' 这样的格式。
首先我把数据处理成每行1个的格式:
a
b
c
d
这样
通过EditPlus的正则替换功能,查找^.* 替换为 '\0' 得到
'a'
'b'
'c'
'd'
然后在通过正则替换,查找 \n 替换为 , 就得到了
'a','b','c','d'
达到目标
有时候更新域名的域名服务器,需要查看是否生效,只能通过根服务器的NS查询来辨别。可以使用下面的命令
nslookup -qt=ns thmz.com a.gtld-servers.net
如果根服务器已经更新的话再对比运营商的dns看看有没有更新
nslookup -qt=ns thmz.com
再或者 nslookup -d thmz.com 自己看看各个节点的过期时间
安装这里以centos为例
yum install libpcap libpcap-devel ncurses-devel ncurses
wget http://dns.measurement-factory.com/tools/dnstop/src/dnstop-20090128.tar.gz
tar zxvf dnstop-20090128.tar.gz
cd dnstop-20090128
./configure
make && make install
使用方法很简单 dnstop eth0
输入? 可以看到详细帮助,这里不多介绍了。
最近论坛在搞抢楼,有用户被判定一分钟发了50贴是机器灌水行为,我好想觉得后台设置过发帖时间限制为10秒的,也就是说1分钟最多发6贴。就自己研究了下,发现自从升级到dz7以来用户的最后更新时间就没更新过,而发帖限制是靠 现在时间-发帖限制时间 和 最后发表时间去比对的,所以导致发帖时间限制的设置形同虚设。所以又仔细看了下更新用户最后发表时间相关代码。
首先来看一段源代码代码
1
2
3
4
5
6
| $self = $creditnotice && $uidarray == $discuz_uid;
……
$lastpostadd = $self ? ", lastpost='$timestamp'" : '';
……
……
$db->query("UPDATE {$tablepre}members SET posts=posts+('$operator$posts') $lastpostadd $creditsadd2 WHERE uid IN ($uids)", 'UNBUFFERED'); |
这里看到要 $self=1 才会把更新最后发表时间的 lastpost=’$timestamp’ 加到update的sql里面,而$self=1的话除了判断下uid之外的话还有个参数 $creditnotice 必需也等于1才行。
也就是必须要打开 dz7 后台 界面 全局里面的积分变动提示才会更新用户最后发表时间。
我想这应该算是个bug把
非常好的一个分词系统,这下有进行了根本性结构的改变,更加适合互联网系统使用。强烈推荐,http://blog.s135.com/httpcws_v100/