1.什么是Nginx的Rewrite规则?
Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE(Perl
Compatible Regular Expressions)Perl兼容正则表达式的语法进行规则匹配,若是php
您须要Nginx的Rewrite功能,在编译Nginx以前,需要编译安装PCRE库.
经过Rewrite规则,能够实现规范的URL,根据变量来作URL转向及选择配置.正则表达式
(1)一些使用MVC框架的程序只有一个入口,能够经过Rewrite来实现.
(2)一些动态URL地址需要假装成静态HTML,便于搜索引擎抓取,也须要Rewrite来处理
(3)一些因为目录结构,域名变化的旧URL,需要跳转到新的URL上,能够经过Rewrite来
处理.
2.Nginx Rewrite规则相关指令
if , rewrite , set , return , break
(1)break,完成当前的规则集,再也不处理rewrite指令.
(2)if 浏览器
语法: if(condition){...} 用于检查一个条件是否符合,若是条件符合,则执行大括号内的语句.if指令不支持嵌 套,不支持多个条件&&和||处理. 如下信息能够被指定为条件: 1)变量名,其中错误的值包括:空字符串"",或者任何以0开始的字符串. 2)变量比较可使用=和!=运算符 3)"~"符号表示区分大小写字母的匹配. 4)"~*"符号表示不区分大小写字母的匹配.如firefox和FireFox是匹配的. 5)"!~"和"!~*"符号的做用恰好和"~","!~"相反,表示不匹配. 6)"-f"和"!-f"用来判断文件是否存在. 7)"-d"和"!-d"用来判断目录是否存在. 8)"-e"和"!-e"用来判断文件或目录是否存在. 9)"-x"和"!-x"用来判断文件是否可执行. (3)return 语法:return code 该指令用于结束规则的执行并返回状态码给客户端.状态码可使用这些 值:204,400,402-406,408,410,413,416,及500-504.非标准状态码,444将以不发送 任何Header头的方式结束链接. 403Forbidden.服务器已经理解请求,可是拒绝执行它. 404Not Found.请求失败,请求所但愿获得的资源未在服务器上发现.404这个状态码 被普遍应用于当服务器不想揭示为什么请求被拒绝,或者没有其余适合的响应可用的情 况下. 500Internal Server Error.服务器遇到一个不曾预料的情况,致使它没法完成对请 求的处理.通常来讲,这个问题都会在服务器的程序码出错时出现. 502Bad Gateway.做为网关或代理工做的服务器尝试执行请求时,从上游服务器接收 到无效的响应. 503Service Unavailable.因为临时的服务器维护或过载,服务器当前没法处理请求. 这个情况是临时的,而且将在一段时间之后恢复.503状态码的存在并不意味着服务器 在过载的时候必须使用它.某些服务器只不过是但愿拒绝客户端的链接. 504 Gateway Timeout做为网关或代理工做的服务器尝试执行请求时,未能及时从上 游服务器(URI标识出的服务器,例如HTTP,FTP,LDAP)或辅助服务器(例如DNS)收到响 应. (4)rewrite指令.语法:rewrite regex replacement flag .该指令根据表达式来重 定向URI,或者修改字符串.指令根据配置文件中的顺序来执行.注意重写表达式只对 相对路径有效.若是想配对主机名,应该使用If语句. rewrite指令的最后一项参数为flag标记,支持的flag标记有: last——至关于Apache里的[L]标记,表示完成rewrite. break——本条规则匹配完成后,终止匹配,再也不匹配后面的规则. redirect——返回302临时重定向,浏览器地址栏会显示跳转后的URL地址. permanent——返回301永久重定向,浏览器地址栏会显示跳转后的URL地址. 在以上标记中,last和break用来实现URI重写,浏览器地址栏的URL地址不变,但在服 务器端访问的路径发生了变化.redirect和permanent用来实现URL跳转,浏览器地址 栏会显示跳转后的URL地址. 1)通常在根location中(即location/{...})或直接在server标签中编写rewrite规则 .推荐使用last标记,在非根location中(location/cms/{...}),则使用break标记. 如: rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last ; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last ; return 403 ; location /download/{ rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break ; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break ; return 403 ; } 2)若是被替换的URI中含有参数(即相似/app/test.php?id=5之类的URI),默认状况 下参数会被自动附加到替换串上,你能够经过在替换串的末尾加上?标记来解决这一 问题.不加?标记和加上?标记的URL跳转区别: rewrite ^/test(.*)$ http://www.yourdomain.com/home permanent ; 访问http://www.yourdomain.com/test?id=5 通过301跳转后的URL地址为 http://www.yourdomain.com/home?id=5 rewrite ^/test(.*)$ http://www.yourdomain.com/home? permanent ; 访问http://www.yourdomain.com/test?id=5 通过301跳转后的URL地址为 http://www.yourdomain.com/home (5)set指令.语法: set variable value .该指令用于定义一个变量,并给变量赋值. 变量的值能够为文本,变量及文本变量的联合.例如: set $varname 'hello' ;u (6)uninitialized_variable_warn 指令. 语法uninitialized_variable_warn on| off 该指令用于开启或关闭记录关于未初始化变量的警告信息,默认值为开启. (7)Nginx Rewrite能够用到的全局变量. 在if , location , 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 , $remote_filename , $request_uri , $query_string , $scheme ,$server_protocol , $server_addr , $server_name , $server_port , $uri