当前位置: 代码迷 >> Web前端 >> Nginx的Rewrite守则
  详细解决方案

Nginx的Rewrite守则

热度:94   发布时间:2012-10-08 19:54:56.0
Nginx的Rewrite规则
=======================================
什么是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