1. location配置规则

1.1 location概述

规则

描述

~

表示执行一个正则匹配,区分大小写

~*

表示执行一个正则匹配,不区分大小写

^*

表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录

=

进行普通字符精确匹配

@

定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

 

 

 

 

 

 

 

location规则的匹配优先级

  • 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
  • ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
  • 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
  • 常规字符串匹配类型。按前缀匹配。

2. rewrite规则模块解析

2.1、rewrite介绍

rewrite和location的功能有点相像,都能实现跳转,主要区别在于rewrite常用于同一域名内更改获取资源的路径,而location是对一类路径做控制访问和反向代理,可以proxy_pass到其他服务器。

Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。
rewrite只能放在server{},location{},if{}中,
并且只能对域名后边的除去传递的参数外的字符串起作用。
Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。
通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。

2.2、ReWrite相关指令

指令

默认值

使用范围

作用

break

none

if,server,location

完成当前的规则集,不再处理rewrite指令,需要和last加以区分

if ( condition ) { … }

none

server,location

用于检测一个条件是否符合,符合则执行大括号内的语句。不支持嵌套,不支持多个条件&&或处理

return

none

server,if,location

用于结束规则的执行和返回状态码给客户端。状态码的值可以是:204,400,402,406,408,410,411,413,416以及500~504,另外非标准状态码444,表示以不发送任何的Header头来结束连接。

rewrite regex replacement flag

 

server,location,if

该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效。该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效。

uninitialized_variable_warn on/off

on

http,server,location,if

该指令用于开启和关闭未初始化变量的警告信息,默认值为开启。

set variable value

none

 

该指令用于定义一个变量,并且给变量进行赋值。变量的值可以是文本、一个变量或者变量和文本的联合,文本需要用引号引起来。

2.3、rewrite常用全局变量

$remote_addr        //获取客户端ip

$binary_remote_addr //客户端ip(二进制)

$remote_port        //客户端port,如:50472

$remote_user        //已经经过Auth Basic Module验证的用户名

$host           //请求主机头字段,否则为服务器名称,如:blog.sakmon.com

$request        //用户请求信息,如:GET ?a=1&b=2 HTTP/1.1

$request_filename   //当前请求的文件的路径名,由root或alias和URI request组合而成,如:/2013/81.html

$status         //请求的响应状态码,如:200

$body_bytes_sent        // 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40

$content_length        // 等于请求行的“Content_Length”的值

$content_type          // 等于请求行的“Content_Type”的值

$http_referer          // 引用地址

$http_user_agent      // 客户端agent信息,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36

$args            //与$query_string相同 等于当中URL的参数(GET),如a=1&b=2

$document_uri        //与$uri相同  这个变量指当前的请求URI,不包括任何参数(见$args) 如:/2013/81.html

$document_root       //针对当前请求的根路径设置值

$hostname        //如:centos53.localdomain

$http_cookie        //客户端cookie信息

$cookie_COOKIE      //cookie COOKIE变量的值

$is_args    //如果有$args参数,这个变量等于”?”,否则等于”",空值,如?

$limit_rate //这个变量可以限制连接速率,0表示不限速

$query_string       // 与$args相同 等于当中URL的参数(GET),如a=1&b=2

$request_body      // 记录POST过来的数据信息

$request_body_file  //客户端请求主体信息的临时文件名

$request_method       //客户端请求的动作,通常为GET或POST,如:GET

$request_uri          //包含请求参数的原始URI,不包含主机名,如:/2013/81.html?a=1&b=2

$scheme            //HTTP方法(如http,https),如:http

$uri            //这个变量指当前的请求URI,不包括任何参数(见$args) 如:/2013/81.html

$request_completion //如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty),如:OK

$server_protocol    //请求使用的协议,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1

$server_addr        //服务器IP地址,在完成一次系统调用后可以确定这个值

$server_name        //服务器名称,如:blog.sakmon.com

$server_port        //请求到达服务器的端口号,如:80

2.4、Nginx rewrite语法

1、rewrite指令语法

指令语法: rewrite regex replacement [flag]
应用位置:server、location、if
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。
下面是一个简单地URL rewrite跳转的例子:

rewrite ^/(.*) http://www.xxx.com/$1 permanent;

2、rewrite指令结尾的flag标记说明

flag标记符号

说 明

last

本条规则匹配完成后,继续向下匹配新的location URI规则

break

本条规则匹配完成即终止,不再匹配后面的任何规则

redirect

返回302临时重定向,浏览器地址栏会显示跳转后的URL地址

permanent

返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址会显示跳转后的URL地址。
last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{…}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则。