iis7开启js的gzip压缩

1、启动网站的压缩功能,这个不用说了,网站配置里面就有。
2、编辑该文件 C:\Windows\System32\inetsrv\config\applicationhost.config,查看 httpCompression 节点,看是否有下面两个配置,不管怎样,把这两个都写进去:

<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/javascript" enabled="true" />

大概就是下面这样了:

    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
        <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
        <staticTypes>
            <add mimeType="text/*" enabled="true" />
            <add mimeType="message/*" enabled="true" />
            <add mimeType="application/x-javascript" enabled="true" />
            <add mimeType="application/javascript" enabled="true" />
            <add mimeType="application/atom+xml" enabled="true" />
            <add mimeType="application/xaml+xml" enabled="true" />
            <add mimeType="*/*" enabled="false" />
        </staticTypes>
        <dynamicTypes>
            <add mimeType="text/*" enabled="true" />
            <add mimeType="message/*" enabled="true" />
            <add mimeType="application/x-javascript" enabled="true" />
            <add mimeType="application/javascript" enabled="true" />
            <add mimeType="*/*" enabled="false" />
        </dynamicTypes>
    </httpCompression>

jquery.datapicker.js在jquery1.6.4+以上不能用的问题

jquery.datapicker已经不在更新了,发现在jQuery1.6.4+不能使用,

找到下面这句:this._dpId = $.event.guid++; 大概在219行,直接搜索$.event.guid就行。

改为如下就可以用了:this._dpId = typeof($.event.guid)!='undefined' ? $.event.guid++ : $.guid++;

简单点就是把$.event.guid改为$.guid

jQuery1.6.4以后就不能用$.event.guid了

php读取ms sql server数据的方法和注意事项

在windows平台,php5.3+读取sql server里面的数据,其实用php_pdo_odbc.dll扩展是最好的选择,SQL语句的兼容性很高,比ms自家出品的sqlsrv(Microsoft Drivers for PHP for SQL Server)扩展强太多了。

一、下面先吐槽一下sqlsrv一些不爽的地方:

1、获取的数据编码默认是UTF-8的,想改为其它编码的数据有点麻烦,虽说它可以设为用系统的编码,但是这里有个很大的问题, 假如你的系统是gbk的,但是获取到的数据有些还是会变为UTF-8的。尽管可以用iconv转换编码,但这个iconv本来就不能转换全部的中文,说不定某些中文就被忽略掉了,不敢用iconv转换成GBK的。

2、某些字段的类型不能自动映射,会出现映射错误,提示数据类型不正确。

3、一些复杂点的SQL语句居然查询不到结果,这个相当无语了,我的SQL语句中出现了中文,居然都返回不了查询结果,不知道是不是编码问题,我也不想测试了。还有个非常奇怪的地方,SQL语句里面用到了ISNULL这个函数,它居然也不执行,取不到任何结果。

总的来说这个东西只能用来处理下英文类的数据,简单点的SQL语句。复杂点的它根本就不行,兼容性太差。

二、用php_pdo_odbc.dll可以很轻松的处理复杂SQL语句及编码问题。当然用pdo_odbc也出现了一点应该注意的问题,不然我也不会在这里吐槽了。读取nvarchar或者nchar字段的数据时,可能会把该字段后面部分的中文给弄成乱码。因为nvarchar字段是按字符存储的,而odbc是按字节读取的,它好像不能处理多字节字符。当它读取到字段长度那么多个字节的时候,后面的字节就被它搞成乱码了,一开始这个问题百思不得其解。有什么办法可以让它不乱码呢,其实你只需要用convert转换一下数据类型为varchar就行了。如:select convert(varchar(两倍的nvarchar字段的长度), nvarchar字段名) from table1。varchar一定要带长度,最好是这个nvarchar字段长度的两倍,这样转换一下后,你获取的数据就不会出现乱码了。

nginx里面codeigniter的重写规则

有下面几种方法

一、使用QUERY_STRING,这个最简单了,nginx里面配置少,性能也应该最好

修改codeinniter里面的application/config/config.php文件,改为如下:

$config['uri_protocol'] = 'QUERY_STRING';

nginx里面这样配置一下就行了

if  (!-f $request_filename) {
rewrite (.+) /index.php?$1 last;
}

二、使用PATH_INFO,由于nginx里面默认是不识别PATH_INFO这个php变量的,它会把PATH_INFO作为一个路径,这样就出现了404错误

修改codeinniter里面的application/config/config.php文件,改为如下:

$config['uri_protocol'] = 'PATH_INFO';

nginx里面加两段代码:

location ~ \.php($|/) {
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
#下面3行让nginx正确识别文件路径和PATH_INFO
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
}

if  (!-f $request_filename) {
rewrite (.+) /index.php$1 last;
}

三、使用REQUEST_URI,这个个人觉得没有使用QUERY_STRING来的方便,不利于二次URL重写,毕竟某些时候你想把CodeIgniter默认重写的URL再次重写为比较短点的,这个时候你就必须用CI的config里面enable_query_strings这个地方配置的查询字符串来rewrite了,感觉有点麻烦,如果你不用二次重写,使用这个方法也很简单的。

修改codeinniter里面的application/config/config.php文件,改为如下:

$config['uri_protocol'] = 'REQUEST_URI';

nginx里面这样配置一下就行了

if  (!-f $request_filename) {
rewrite .+ /index.php last;
}

[vps性能优化] centos安装后的几点优化

1. 解决使用putty远程访问centos出现乱码的问题
编辑vi /etc/sysconfig/i18n这个文件,不管你装的是中文版,还是英文版.删掉原来的配置,把下面的拷贝过去
LANG="zh_CN.GB18030"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
注:I18N 是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软件的“国际化”。
I18N支持多种语言,但是同一时间只能是英文和一种选定的语言,例如英文中文、英文 德文、英文 韩文等等。

2. 检查系统是否正常 
# more /var/log/messages (检查有无系统内核级错误信息)
# dmesg (检查硬件设备是否有错误信息)
# ifconfig(检查网卡设置是否正确)
# ping qq.com (检查网络是否正常,dns是否配置正确cat etc/resolv.conf)
关闭不需要的服务
# ntsysv
以下仅列出需要启动的服务,未列出的服务一律关闭:
crond (计划调度工具)
irqbalance (仅当服务器CPU为S.M.P架构或支持双核心、HT技术时,才需开启,否则关闭。)
microcode_ctl (cpu的系统)
network (网络服务)
iptables (系统自带的防火墙)
sshd (远程访问服务)
syslog (系统登录)

3. 配置yum
更换yum的升级列表
cd /etc/yum.repos.d
mv CentOS-Base.repo  CentOS-Base.repo.save
wget http://centos.ustc.edu.cn/CentOS-Base.repo.5
mv CentOS-Base.repo.5 CentOS-Base.repo

4. 更新所有系统中的程序,包括内核
# yum upgrade

(yum update 排除升级内核,方法有两个:)
1.修改yum的配置文件 vi /etc/yum.conf,
在[main]的最后添加exclude=kernel*
2.直接在yum的命令行执行如下的命令:
yum --exclude=kernel* update

5. 定时校正服务器时间 
# yum install ntp
# crontab -e
加入一行:
*/15 * * * * ntpdate 210.72.145.44
## 210.72.145.44 为中国国家授时中心服务器地址。

6. 停止网卡对ipv6的支持
#vi /etc/modprobe.conf ← 修改相应配置文件,添加如下行到文尾:
alias net-pf-10 off
alias ipv6 off
上述操作重启后生效

7. 让系统运行在init 3的模式下
#vi /etc/inittab
###表示当前缺省运行级别为5(initdefault);
id:5:initdefault: ← 将此处的5修改为3。

8. 使用 yum 程序安装所需开发包
(以下为标准的 RPM 包名称)
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers

9. Linux SSH 安全策略二:更改 SSH 端口
默认的 SSH 端口是 22。强烈建议改成 10000 以上。这样别人扫描到端口的机率也大大下降。修改方法:
# 编辑 /etc/ssh/ssh_config
vi /etc/ssh/ssh_config
# 在 Host * 下 ,加入新的 Port 值。以 18439 为例(下同):
Port 22
Port 18439
# 编辑 /etc/ssh/sshd_config
vi /etc/ssh/sshd_config
#加入新的 Port 值
Port 22
Port 18439
# 保存后,重启 SSH 服务:
service sshd restart
这里我设置了两个端口,主要是为了防止修改出错导致 SSH 再也登不上。
更改你的 SSH 客户端(例如:Putty)的连接端口,测试连接,如果新端口能连接成功,则再编辑上面两个文件,删除 Port 22 的配置。
如果连接失败,而用 Port 22 连接后再重新配置。
端口设置成功后,注意同时应该从 iptables 中, 删除22端口,添加新配置的 18439,并重启 iptables。
如果 SSH 登录密码是弱密码,应该设置一个复杂的密码。

ajax中使用HTTP Basic Authenticate

抓包可以发现其实就是多了个header,header串可以如下构造:

[code language="javascript"]
function make_base_auth(user, password) {
var tok = user + ':' + pass;
var hash = Base64.encode(tok);
return "Basic " + hash;
}
[/code]

Base64.encode自己网上找个base64编码的javascript版就可以了,这里不提供。
以下为用jQuery发送请求的代码:

[code language="javascript"]
var auth = make_basic_auth('me', 'mypassword'); //用户名和密码
var url = 'http://example.com';
$.ajax({
url : url,
method : 'GET',
beforeSend : function(req) {
req.setRequestHeader('Authorization', auth);
}
});
[/code]

base32 encoding in javascript

经测试不支持中文,只支持英文字符。

[code language="javascript"]
var baseenc = baseenc || {};
baseenc.b32encode = function(s) {
/* encodes a string s to base32 and returns the encoded string */
var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";

var parts = [];
var quanta= Math.floor((s.length / 5));
var leftover = s.length % 5;

if (leftover != 0) {
for (var i = 0; i < (5-leftover); i++) { s += '\x00'; }
quanta += 1;
}

for (i = 0; i < quanta; i++) {
parts.push(alphabet.charAt(s.charCodeAt(i*5) >> 3));
parts.push(alphabet.charAt( ((s.charCodeAt(i*5) & 0x07) << 2)
| (s.charCodeAt(i*5+1) >> 6)));
parts.push(alphabet.charAt( ((s.charCodeAt(i*5+1) & 0x3F) >> 1) ));
parts.push(alphabet.charAt( ((s.charCodeAt(i*5+1) & 0x01) << 4)
| (s.charCodeAt(i*5+2) >> 4)));
parts.push(alphabet.charAt( ((s.charCodeAt(i*5+2) & 0x0F) << 1)
| (s.charCodeAt(i*5+3) >> 7)));
parts.push(alphabet.charAt( ((s.charCodeAt(i*5+3) & 0x7F) >> 2)));
parts.push(alphabet.charAt( ((s.charCodeAt(i*5+3) & 0x03) << 3)
| (s.charCodeAt(i*5+4) >> 5)));
parts.push(alphabet.charAt( ((s.charCodeAt(i*5+4) & 0x1F) )));
}

var replace = 0;
if (leftover == 1) replace = 6;
else if (leftover == 2) replace = 4;
else if (leftover == 3) replace = 3;
else if (leftover == 4) replace = 1;

for (i = 0; i < replace; i++) parts.pop();
for (i = 0; i < replace; i++) parts.push("=");

return parts.join("");
};
[/code]

via

javascript版base64编码和解码

[code language="javascript"]

var base64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var base64DecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,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,-1,-1,-1,-1,-1,-1,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,-1,-1,-1,-1,-1);

function base64_encode(str){var utf16to8=function(s){var out,i,len,c;out="";len=s.length;for(i=0;i<len;i++){c=s.charCodeAt(i);if((c>=0x0001)&&(c<=0x007F)){out+=s.charAt(i)}else if(c>0x07FF){out+=String.fromCharCode(0xE0|((c>>12)&0x0F));out+=String.fromCharCode(0x80|((c>>6)&0x3F));out+=String.fromCharCode(0x80|((c>>0)&0x3F))}else{out+=String.fromCharCode(0xC0|((c>>6)&0x1F));out+=String.fromCharCode(0x80|((c>>0)&0x3F))}}return out};str=utf16to8(str);var out,i,len;var c1,c2,c3;len=str.length;i=0;out="";while(i<len){c1=str.charCodeAt(i++)&0xff;if(i==len){out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt((c1&0x3)<<4);out+="==";break}c2=str.charCodeAt(i++);if(i==len){out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));out+=base64EncodeChars.charAt((c2&0xF)<<2);out+="=";break}c3=str.charCodeAt(i++);out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));out+=base64EncodeChars.charAt(((c2&0xF)<<2)|((c3&0xC0)>>6));out+=base64EncodeChars.charAt(c3&0x3F)}return out}

function base64_decode(str){var c1,c2,c3,c4;var i,len,out;len=str.length;i=0;out="";while(i<len){do{c1=base64DecodeChars[str.charCodeAt(i++)&0xff]}while(i<len&&c1==-1);if(c1==-1)break;do{c2=base64DecodeChars[str.charCodeAt(i++)&0xff]}while(i<len&&c2==-1);if(c2==-1)break;out+=String.fromCharCode((c1<<2)|((c2&0x30)>>4));do{c3=str.charCodeAt(i++)&0xff;if(c3==61)return out;c3=base64DecodeChars[c3]}while(i<len&&c3==-1);if(c3==-1)break;out+=String.fromCharCode(((c2&0XF)<<4)|((c3&0x3C)>>2));do{c4=str.charCodeAt(i++)&0xff;if(c4==61)return out;c4=base64DecodeChars[c4]}while(i<len&&c4==-1);if(c4==-1)break;out+=String.fromCharCode(((c3&0x03)<<6)|c4)}var utf8to16=function(s){var out,i,len,c;var char2,char3;out="";len=s.length;i=0;while(i<len){c=s.charCodeAt(i++);switch(c>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out+=s.charAt(i-1);break;case 12:case 13:char2=s.charCodeAt(i++);out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));break;case 14:char2=s.charCodeAt(i++);char3=s.charCodeAt(i++);out+=String.fromCharCode(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<<0));break}}return out};return utf8to16(out)}

[/code]

PHP字符串加密解密函数

[code language="php"]
function encrypt( $string, $operation = 'DECODE', $key = '', $expiry = 3600 ){

$ckey_length = 4;
// 随机密钥长度 取值 0-32;
// 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
// 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
// 当此值为 0 时,则不产生随机密钥
$key = md5( $key ? $key : 'default_key' ); //这里可以填写默认key值
$keya = md5( substr( $key, 0, 16 ) );
$keyb = md5( substr( $key, 16, 16 ) );
$keyc = $ckey_length ? ( $operation == 'DECODE' ? substr( $string, 0, $ckey_length ): substr( md5( microtime() ), - $ckey_length ) ) : '';

$cryptkey = $keya . md5( $keya . $keyc );
$key_length = strlen( $cryptkey );

$string = $operation == 'DECODE' ? base64_decode( substr( $string, $ckey_length ) ) : sprintf( '%010d', $expiry ? $expiry + time() : 0 ) . substr( md5( $string . $keyb ), 0, 16 ) . $string;
$string_length = strlen( $string );

$result = '';
$box = range( 0, 255 );

$rndkey = array();
for( $i = 0; $i <= 255; $i++ ){
$rndkey[$i] = ord( $cryptkey[$i % $key_length] );
}

for( $j = $i = 0; $i < 256; $i++ ){
$j = ( $j + $box[$i] + $rndkey[$i] ) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}

for( $a = $j = $i = 0; $i < $string_length; $i++ ){
$a = ( $a + 1 ) % 256;
$j = ( $j + $box[$a] ) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr( ord( $string[$i] ) ^ ( $box[( $box[$a] + $box[$j] ) % 256] ) );
}

if( $operation == 'DECODE' ){
if( ( substr( $result, 0, 10 ) == 0 || substr( $result, 0, 10 ) - time() > 0 ) && substr( $result, 10, 16 ) == substr( md5( substr( $result, 26 ) . $keyb ), 0, 16 ) ){
return substr( $result, 26 );
}else{
return '';
}
}else{
return $keyc . str_replace( '=', '', base64_encode( $result ) );
}
}
[/code]