巧用nginx的sendfiles设置404

使用LNMP架构的朋友会知道,如果直接在PHP中进行header 404设置用户会访问到一个空白的页面,为了解决这种问题,我们可以使用NGINX的SENDFILE特性来让用户直接看到NGINX默认的404页面。

header('status: 404 Not Found');
header('X-Accel-Redirect: '.'1.exe');


这样设置,用户直接看到的就会直接是NGINX默认的404页面了。

设置前:

设置后:

网上看到的一个不错的PHP可逆字符加密算法。

测试了下,在没有原$ikey以及$key的情况下是无法对加密后的字符串进行逆运算的。

 /*
     * 加密,可逆
     * 可接受任何字符
     * 安全度非常高
     */
    function encrypt($txt, $key = 'anihc ctI')
    {
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
        $ikey ="-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm";
        $nh1 = rand(0,64);
        $nh2 = rand(0,64);
        $nh3 = rand(0,64);
        $ch1 = $chars{$nh1};
        $ch2 = $chars{$nh2};
        $ch3 = $chars{$nh3};
        $nhnum = $nh1 + $nh2 + $nh3;
        $knum = 0;$i = 0;
        while(isset($key{$i})) $knum +=ord($key{$i++});
        $mdKey = substr(md5(md5(md5($key.$ch1).$ch2.$ikey).$ch3),$nhnum%8,$knum%8 + 16);
        $txt = base64_encode($txt);
        $txt = str_replace(array('+','/','='),array('-','_','.'),$txt);
        $tmp = '';
        $j=0;$k = 0;
        $tlen = strlen($txt);
        $klen = strlen($mdKey);
        for ($i=0; $i<$tlen; $i++) {
            $k = $k == $klen ? 0 : $k;
            $j = ($nhnum+strpos($chars,$txt{$i})+ord($mdKey{$k++}))%64;
            $tmp .= $chars{$j};
        }
        $tmplen = strlen($tmp);
        $tmp = substr_replace($tmp,$ch3,$nh2 % ++$tmplen,0);
        $tmp = substr_replace($tmp,$ch2,$nh1 % ++$tmplen,0);
        $tmp = substr_replace($tmp,$ch1,$knum % ++$tmplen,0);
        return $tmp;
    }
    
    /*
     * 解密
     * 
     */
     function decrypt($txt, $key = 'anihc ctI')
     {
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
        $ikey ="-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm";
        $knum = 0;$i = 0;
        $tlen = strlen($txt);
        while(isset($key{$i})) $knum +=ord($key{$i++});
        $ch1 = $txt{$knum % $tlen};
        $nh1 = strpos($chars,$ch1); 
        $txt = substr_replace($txt,'',$knum % $tlen--,1);
        $ch2 = $txt{$nh1 % $tlen};
        $nh2 = strpos($chars,$ch2);
        $txt = substr_replace($txt,'',$nh1 % $tlen--,1);
        $ch3 = $txt{$nh2 % $tlen};
        $nh3 = strpos($chars,$ch3);
        $txt = substr_replace($txt,'',$nh2 % $tlen--,1);
        $nhnum = $nh1 + $nh2 + $nh3;
        $mdKey = substr(md5(md5(md5($key.$ch1).$ch2.$ikey).$ch3),$nhnum % 8,$knum % 8 + 16);
        $tmp = '';
        $j=0; $k = 0;
        $tlen = strlen($txt);
        $klen = strlen($mdKey);
        for ($i=0; $i<$tlen; $i++) {
            $k = $k == $klen ? 0 : $k;
            $j = strpos($chars,$txt{$i})-$nhnum - ord($mdKey{$k++});
            while ($j<0) $j+=64;
            $tmp .= $chars{$j};
        }
        $tmp = str_replace(array('-','_','.'),array('+','/','='),$tmp);
        return trim(base64_decode($tmp));
    }

原地址:http://bbs.phpchina.com/thread-37376-1-1.html

使用PHP检测手机访问自动跳转WAP站的方法.

check_wap.php文件内容:

<?php
/**
*判断是否是通过手机访问
*/

function isMobile() {

	// 如果有HTTP_X_WAP_PROFILE则一定是移动设备
	if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {
		return true;
	}

	//如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息

	if (isset ($_SERVER['HTTP_VIA'])) {
		//找不到为flase,否则为true
		return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
	}

	//判断手机发送的客户端标志,兼容性有待提高
	if (isset ($_SERVER['HTTP_USER_AGENT'])) {
		$clientkeywords = array (
		'nokia', 'sony', 'ericsson', 'mot',
		'samsung', 'htc', 'sgh', 'lg', 'sharp',
		'sie-', 'philips', 'panasonic', 'alcatel',
		'lenovo', 'iphone', 'ipod', 'blackberry',
		'meizu', 'android', 'netfront', 'symbian',
		'ucweb', 'windowsce', 'palm', 'operamini',
		'operamobi', 'openwave', 'nexusone', 'cldc',
		'midp', 'wap', 'mobile'
		);

		// 从HTTP_USER_AGENT中查找手机浏览器的关键字
		if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
			return true;
		}
	}

	//协议法,因为有可能不准确,放到最后判断
	if (isset ($_SERVER['HTTP_ACCEPT'])) {

		// 如果只支持wml并且不支持html那一定是移动设备
		// 如果支持wml和html但是wml在html之前则是移动设备
		if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
			return true;
		}
	}

	return false;
}

//跳转js

$js =
<<<EOT
var pgo=0;
function JumpUrl(){ if(pgo==0){ location='http://wap.jzbk.org'; pgo=1; } }
setTimeout('JumpUrl()',3000);
EOT;

//如果检测为wap访问,则跳转
if(isMobile()) {
	echo $js;
}

?>

在html页面引入

<script type="text/javascript" src="check_wap.php" ></script><!--wap跳转JS-->

 

[原创]PHP图片防盗链

貌似这个东西实用性不是不大,就是写着好玩吧。
介绍:脚本可以隐藏图片的真实地址,起到防盗链的作用(似乎对IE兼容不佳,以后有空再慢慢弄吧),脚本能根据GET变量调用不同的图片。而且脚本使用了Nginx的X-sendfile特性大大提升了使用效率。
P.S:脚本写的很渣,大家看看就行了。

<?php
include 'function.php';
session_start();

//获取GET数据
$n = $_GET["n"];
$f = $_GET["f"];
$h = $_GET["h"];
$aid = $_GET["aid"];

//如果AID为空对浏览器进行跳转,获取AID
if($aid == "") {
	$_SESSION["AID"] = md5($_SERVER["REMOTE_ADDR"].$_SERVER["REMOTE_PORT"]);
	$aid = $_SESSION["AID"];
	header("Location: ./pic.php?n=$n&f=$f&h=$h&aid=$aid");
	exit;
}

//对比获取到的AID和SESSION中的数据
//获取文件后缀类型,并设置header
if($_SESSION["AID"] != $aid){
	header("content-type:image/png");
	MsgImg("对不起,此图片链接已经失效!");
	exit;
}else {
	$hz=Check($h,1,1,1);
	switch($hz) {
		case 1:
			$hz = jpg;
			header("content-type:image/jpeg");
			break;
		case 2:
			$hz = jpge;
			header("content-type:image/jpeg");
			break;
		case 3:
			$hz = gif;
			header("content-type:image/gif");
			break;
		case 4:
			$hz = png;
			header("content-type:image/x-png");
		break;
		default:
			unset($hz);
	}
}

$name = Check($n,1,30,0).'.'.$hz;//源图片名
$floor = Check($f,2,5,0);//源目录

//判断是否有变量为空
if($hz == "" || $name == "" || $floor == "") {
	header("content-type:image/png");
	MsgImg("对不起,找不到该图片!");
	quit();
}


//判断文件时候存在,如存在则输出所选。不存在则输出文字信息。
if(file_exists("./upload/$floor/$name")) { //图片的实际路径
	$filePath = "/download/$floor/$name";//完整路径使用Nginx的X-sendfile输出图片。
	header('X-Accel-Redirect: '.$filePath);
	//@readfile("./upload/$floor/$name");
	quit();
}else {
	header("content-type:image/png");
	MsgImg("对不起,找不到该图片!");
	quit();
}

function quit() {
	session_unset();
	session_destroy();
	exit();
}
?>

function.php文件

<?php
//检查输入数据
function Check($name,$min,$max,$suffix) {
	$Max_Strlen=$max;//最大长度
	$Min_Strlen=$min;//最短长度

	if($suffix == "1") {
		 $Chars="^[0-9]";//检查字符为纯数字
	} else {
	 	$Chars="^[A-Za-z0-9_-]";//检查字符
	}

	 $Output = "$name";//定义返回的字符串变量

	if(!mb_ereg("$Chars",$name))  { //正则表达式匹配检查
	 	$Output="";
		return $Output;
	}
	 
	if (strlen($name)<$Min_Strlen || strlen($name)>$Max_Strlen) {
	 	$Output="";
	 	return $Output;
	}

	return $Output;
}
	
function MsgImg($msg){
	// 创建图片
	$im = imagecreatetruecolor(400, 30);

	// 设置颜色
	$white = imagecolorallocate($im, 255, 255, 255);
	$grey = imagecolorallocate($im, 128, 128, 128);
	$black = imagecolorallocate($im, 0, 0, 0);
	imagefilledrectangle($im, 0, 0, 399, 29, $white);

	// 设置字体
	$font = 'wd.ttf';

	// 设置阴影
	imagettftext($im, 20, 0, 11, 21, $grey, $font, $msg);

	// 打印文字
	imagettftext($im, 20, 0, 10, 20, $black, $font, $msg);

	// 创建PNG文件
	imagepng($im);
	imagedestroy($im);
}
?>

 

WordPress更换域名 主页和图片路径错误 解决办法

首先介绍下SQL替换命令

UPDATE 表名 SET 字段 = REPLACE(字段,’替换内容’,'替换值’);

示例如下:

UPDATE wp_options SET option_value = REPLACE(option_value,'old-domain.com','new-domain.com');

注意上面的标点要都要用英文半角。其中wp_options就是表名,option_value就是表wp_options里的一个字段,wp_options里有siteurl和home的值。

一般只要执行以下命令,就可完成域名的修改:

修改option_value里的站点url和主页地址

UPDATE wp_options SET option_value = replace(option_value, 'http://www.old-domain.com', 'http://www.new-domain.com') WHERE option_name = 'home' OR option_name = 'siteurl';

更正文章中内部链接及附件的地址

UPDATE wp_posts SET post_content = replace(post_content, 'http://www.old-domain.com', 'http://www.new-domain.com');

更正wordpress文章默认的永久链接

UPDATE wp_posts SET guid = replace(guid, 'http://www.old-domain.com','http://www.new-domain.com');

解决phpMyAdmin提示“链接表的附加功能尚未激活”的方法

版本:phpMyAdmin 较新版
错误描述:登陆后提示“链接表的附加功能尚未激活”
解决方法
1、进入phpmyadmin
2、直接在根目录导入phpmyadmin的scripts文件夹里的create_tables.sql,会自动生成名为phpmyadmin的数据库
3、然后修改phpmyadmin的libraries文件夹里的config.default.php(其实也可以是phpmyadmin根目录下的config.inc.php,但很多都没有,只有带sample的,没设置好,所以直接改default的,记得备份)
4、修改的部分
之前

$cfg['Servers'][$i]['pmadb'] = '';
$cfg['Servers'][$i]['bookmarktable'] = '';
$cfg['Servers'][$i]['relation'] = '';
$cfg['Servers'][$i]['table_info'] = '';
$cfg['Servers'][$i]['table_coords'] = '';
$cfg['Servers'][$i]['pdf_pages'] = '';
$cfg['Servers'][$i]['column_info'] = '';
$cfg['Servers'][$i]['history'] = '';
$cfg['Servers'][$i]['tracking'] = '';

之后

$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';
$cfg['Servers'][$i]['relation'] = 'pma_relation';
$cfg['Servers'][$i]['table_info'] = 'pma_table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma_column_info';
$cfg['Servers'][$i]['history'] = 'pma_history';
$cfg['Servers'][$i]['tracking'] = 'pma_tracking';

5、这些项目都不是连续的,逐个改吧,如果是根目录配置好的config.inc.php,却是连续的。
6、保存,重新登陆phpmyadmin,完成

ps.网上搜了很多方法,重点都是config文件的位置默认配置好都是在根目录的config.inc.php的,但很多都没配置,只有config.sample.inc.php这个,所以方法失效。

转自:http://neverno.info/O_O/articles-225-2011-04-14.html