**Rewrite功能的配置**
*Rewrite概念*
地址重写和地址转发。当网站改变网址了,可以让用户原先保存的书签照样可以访问。也无需更换其他网站到我们网站的友情链接。
*地址重写*
概念:当我们访问 www.google.com 和 google.cn 都可以访问到谷歌,只不过在访问google.cn的时候把他转为 www.google.com 。
*地址转发*
概念:将一个域名指向一个已存在的站点的过程。
*地址重写和地址转发的区别*
1、转发不会改变浏览器地址栏的地址,而重写会。
2、转发只会发送一次网络请求,重写会发送两次。
3、转发一般用在站内,重写没有限制。
4、转发可以不写全地址,重写必须写全。
....
*rewrite* 注意在进行正则匹配的时候用到 {} 必须要加上引号给uri 否则会保错。
rewrite regex replacement
`rewrite` :是指令,可以用再server块和location块使用。
`regex`:匹配的uri, uri和url是不同的,如https://www.123du.cc/dudu-37/648524/ uri是/dudu-37/648524/部分。 可以匹配一部分数据然后,在replacement里使用。
`replacement`:匹配成功后跳转的地址,如:https://www.baidu.com/
*例子*
rewrite ^/ https://www.baidu.com/ #匹配成功跳入百度
rewrite ^(/.* )(\.php) https://www.baidu.com$1$2 #匹配成功后,吧获取的参数 $1 $2 追加给百度链接后面,
如:访问 https://www.123du.cc/dudu-37/648524/ 跳转到 https://www.baidu.com/dudu-37/648524/
*利用Rewrite功能做防盗链*
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
valid_referers none blocked www.baidu.com ;
if ($invalid_referer) {
rewrite ^/ https://www.baidu.com/images/abc.png;
}
}
*解析*
`location`:匹配uri的指令。
`valid_referers` : 获取Referer头域的值,并根据这个值来改变 全局变量 $invalid_refere 的值。
`none`: Referer头域的值为空,的时候。
`blocked`:Referer头域的值被代理服务器或防火墙删除或伪装的情况下。
`server_name`:允许访问的域名或ip可以设置多个,可以使用通配符`*`,我这里是‘www.baidu.com’。
当valid_referers 匹配成功的时候回吧全局的 $invalid_referer设置为0,匹配不成功设置为1。
`rewrite `:条件成立,直接给他返回个图片地址。你也可以设置成HTTP状态码。直接return 404;
这里有个需要注意的问题:
重启nginx报错:nginx: [emerg] unknown directive "if($invalid_referer)" in /etc/nginx/nginx.conf:47
这是因为需要给 if ($invalid_referer) { }加空格,要不nginx就认为这个整体这是一个指令。所以报指令不存在的错误。
而且,nginx需要语句需要必须以 ; 结尾。