Nginx的Rewrite规则

本文深入探讨了Nginx的Rewrite规则,包括其基本概念、相关指令、使用技巧和防盗链功能。通过实例展示了如何利用Rewrite规则实现URL重写、重定向和变量设置等操作。
=======================================
什么是Nginx的Rewrite规则
Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE,Perl兼容正则表达式的语法进行规则匹配。


=======================================
Nginx Rewrite 规则相关指令

break指令
语法:break
默认值:none
作用域: server,location,if


if指令
语法:if(condition){....}
默认值:none
作用域: server,location

缺点:
1)不支持嵌套
2)不支持多个条件&& ,||处理
3) “~“表示区分大小写字母的匹配,”~*”表示不区分大小写字母匹配
4)"!~","!~*"与"~","~*"意义相反
5)"-f","!-f"表示文件是否存在
6)“-d”和"!-d"表示目录是否存在
7)“-e”和"!-e"表示目录或文件是是否存在
8)“-x”和"!-x"表示文件是否可执行

部分正则表达式可以在圆括号()内,其值可以通过后面的变量$1至$9访问
rewrite ^(.*) /msie/$1 break;

return 指令
语法: return code
默认值: none
作用域: server,location,if

结束规则的执行并返回状态码给客户端. 状态码:204,400,402~406,410,411,413,及500~504

rewrite 指令
语法: rewrite regex replacement flag
默认值:none
作用域: server ,location ,if

if($host ~* www\.(.*))
{
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent;
}

flag标记的参数值:
last-完成rewrite。(本条rewrite规则执行完毕后,会对其所在的server{...}标签重新发起请求)
break-本条规则匹配完成后,终止匹配,不再匹配后面的规则。(本条规则匹配完成后,终止匹配,不再匹配后面的规则)
redirect-返回302临时重定向,浏览器地址栏会显示跳转后的URL地址。
permanent-返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

URL是带参数的,默认情况下,会自动添加上。如果不想加参数,请在替换的字符串上加上?
带参数
rewrite ^/test(.*)$ http://www.yourdomain.com/home permanent;
重定向前
http://www.yourdomain.com/test?id=5
重定向后
http://www.yourdomain.com/home?id=5


不带参数
rewrite ^/test(.*)$ http://www.yourdomain.com/home? permanent;
重定向前
http://www.yourdomain.com/test?id=5
重定向后
http://www.yourdomain.com/home


注:对花括号({})来说,它们既能用在重定向的正则表达式里,也能用在配置文件里分割代码块,为了避免冲突,正则表达式里如果带花括号,应该用双引号包围。

/photos/123456
重定向到
/photos/12/34/56/123456.png
rewrite "/photos/([0-9]{2})([0-9]{2})([0-9]{2})"
/photos/$1/$2/$3/$1$2$3.png

set指令
语法: set variable value
默认值 none
作用域 server,location,if
set $varname 'value';


======================
Nginx Rewrite用到的全局变量
$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri

====================================================
防盗链
location ~* \.(gif|jpg|png|swf|flv)$
{
valid_referers none blocked www.yourdomain.com *.yourdomain.com;
if($invalid_referer)
{
rewrite ^/(.*) http://www.yourdomain.com/blocked.html;
}
}

有关Referer的解释:

当一个请求头的Referer字段中包含一些非正确的字段,这个模块可以禁止这个请求访问站点。
这个头可以随意的伪造,因此,使用这个模块并不能100%的阻止这些请求,绝大多数拒绝的请求来自一些典型的浏览器,
可以认为这些典型的浏览器并不能提供一个”Referer”头,甚至是那些正确的请求。

指令:valid_referers

语法:valid_referers [none|blocked|server_names] …
默认值:none
使用字段:server, location
这个指令在referer头的基础上为 $invalid_referer 变量赋值,其值为0或1。
可以使用这个指令来实现防盗链功能,如果valid_referers列表中没有Referer头的值, $invalid_referer将被设置为1(

参照前例)。
参数可以使如下形式:

none意为不存在的Referer头
blocked意为根据防火墙伪装Referer头,如:“Referer: XXXXXXX”。
server_names为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“*”通配符
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值