Nginx配置应用实例汇总

防盗链
Nginx中防盗链是依靠valid_referers指令来完成的,一般是放在server或location段中:

location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ {
     valid_referers none blocked *.ifeeline.com;
     if ($invalid_referer) {
      		return 403;
     }
}

其中的none表示空的来路,也就是直接访问,blocked表示被防火墙标记过的来路。

在正常访问中,HTTP的请求头都会返回一个referfer的参数,它标记当前的请求的来源,如果为空表示直接访问。

如果当前请求是http://blog.ifeeline.com/refer.php,里面嵌入了很多图片,图片会发起新的请求,那么这些图片的请求中就有一个referer的参数,它的值就是前面这个URL。另外,如果从一个连接点击跳转到另一个连接,那么后一个连接的referer的值就是前一个的连接。所以,当别人的网页盗用你的图片地址时,referer记录的就是盗用你图片的域。

注意:referer的值是否发送,完全是有浏览器决定的,目前大部分浏览器都主动发送这个referer,但是也有浏览器发送的referer不准确。

对于一般访问,这种防盗链的方法还是有效的,但是想对付程序采集就有点难度了。因为referer可以被伪造:

function GrabImage($url, $filename = "",$referer = ""){
	if($url == ""){return false;}
	$extt = strrchr($url, ".");
	$ext = strtolower($extt);
	if($ext != ".gif" && $ext != ".jpg" && $ext != ".png" && $ext != ".bmp"){echo $url."-格式不支持!";return false;}
	
	if($filename == ""){ $filename = time()."$extt"; }//以时间戳另起名
	
	ob_start();
	
	//-----------
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	if($referer != ""){
		curl_setopt($ch, CURLOPT_REFERER, $referer);
	}
	curl_exec($ch);
	curl_close($ch);
	//----------
	
	$img = ob_get_contents();
	ob_end_clean();
	
	$size = strlen($img);
	$fp = fopen($filename , "a");
	fwrite($fp, $img);
	fclose($fp);
	
	return $filename;
}

可见,可以通过PHP的curl模块发送连接(伪造一个合法的referer),这样反盗链的设置就被跳过了。

Magento2.x Nginx + SSL 配置