=======================================
什么是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