防盗链的原理我们在lamp中已经有介绍,这里不再重复,直接看配置过程。
核心语句为
valid_referers none blocked server_names *.test.com ;
if ($invalid_referer) {
return 403;
}
当然我们要将其放在location里面,结合之前的缓存有效期配置,就形成如下结构
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 7d; //针对上面匹配的文件,设置缓存时间为7天
valid_referers none blocked server_names *.test.com ; //指定有效的referer
if ($invalid_referer) {
return 403; // 如果是无效的referer,则禁止访问,返回403
}
access_log off; //针对以上location匹配的文件不记录访问日志
}
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 -I -e "http://www.baidu.com/1.txt" test.com/2.jpg
curl -x127.0.0.1:80 -I -e "http://test.com/1.txt" test.com/2.jpg
需求一,针对admin目录做一个访问限制,只允许本机127.0.0.1访问,拒绝其他所有ip。配置如下
location /admin/
{ allow 127.0.0.1;
deny all;
}
我们先来看下他的逻辑,在apache中,有一个 order ,会定义deny和allow的一个先后执行顺序,而且每条规则都会去匹配。比如针对当前这个需求配置时这样的
<Directory /data/wwwroot/www.123.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
若果将上面改为Order allow,deny 则会deny 所有,allow 语句失效。在nginx 里面从上往下只要匹配到规则就结束。第一条规则匹配到就不会去匹配第二条规则。
curl -x127.0.0.1:80 test.com/admin/index.html
curl -x192.168.226.130:80 test.com/admin/index.html
其中 192.168.226.130 是本机ens33 网卡ip
如果只限制个别ip 访问则可以写成
location /admin/
{
deny 192.168.226.130;
}
默认是允许所有的。不需要写allow all 了
也可以匹配正则限制
location ~ .*(upload|image)/.*\.php$
{
deny all;
}
这样就拒绝请求了upload或者image目录下的php文件
备注:该段配置要加在解析php的配置前面,否则不能限制解析php
限制指定use_agent的域名访问,匹配符~后面的*可以忽略大小写匹配
if ($http_user_agent ~* ‘Spider/3.0|YoudaoBot|Tomato‘)
{
return 403;
}
curl -x127.0.0.1:80 test.com -A "spider/3.0"
意思是限制一些爬虫,或者有道机器人,或者tomato相关的访问。就是可以有针对性的限制某些访问。
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
}
fastcgi_pass unix:/tmp/php-fcgi.sock; 该行指定监听php-fpm的socket,可以是ip加端口的形式,写法要和php-fpm配置文件保持一致。对应行为 listen = /tmp/php-fcgi.sock。配置文件为 /usr/local/php-fpm/etc/php-fpm.conf,我们安装php时有指定配置文件路径。
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;该行中的
/data/wwwroot/test.com 要跟虚拟主机保持一致vim /data/wwwroot/test.com/2.php
写入一下内容
<?php
echo "a really php script";
?>
执行-s reload 后curl 测试
curl -x127.0.0.1:80 test.com/2.php
代理服务器:
通常说的代理就是正向代理,正向代理的过程隐藏了真实的客户端,服务端不知道真实的客户端是谁,×××服务器,就是正向代理。反向代理代理的是服务端,隐藏了真实的服务端。
正向代理中,proxy和client同属一个LAN
反向代理中,proxy和server同属一个LAN
编辑一个新的虚拟主机
vim /usr/local/nginx/conf/vhost/proxy.conf
server
{
listen 80;
server_name proxybaidu.com; //本地代理服务器器域名
location /
{
proxy_pass http://61.135.169.125/; //被代理的服务器ip
proxy_set_header Host www.baidu.com; //指定被代理的服务器域名
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
crul -x127.0.0.1:80 proxybaidu.com
我们发现通过本地内网访问到了百度首页。为了理解代理,特意将代理服务器域名重命名了下,通常代理服务器域名会写的和提供网站资源的服务器域名一样,这样对于客户端来说就不会去区分,省去很多麻烦。百度这个ip 我们通过ping www.baidu.com 来获取。
总结:上面实验就是一个反向代理。怎么理解反响代理隐藏服务端,代理服务器和真实服务端处于同一子网呢?该实验我将proxybaidu.com更改为baidu.com,然后在windos 主机上设置本地dns ,再去访问百度,完全看不出来是从我的虚拟机web中取的数据,因此隐藏了服务端。那么为什么说我的虚拟机web 和百度处于同一子网呢,回答这个问题之前,我先说下很关键的一点,就是我们所说的服务器和客户端,局域网和公网,或者同一子网都是相对意义上的概念,单独讨论没有意义。-x127.0.0.1:80 就是指定本地私网,对于该回环地址来说,因为我们的虚拟机 nat 到了主机所处的公网里,所以从整体上看来我们的虚拟机web 和百度是处于同一子网的。
原文地址:http://blog.51cto.com/12606610/2108638