Nginx的rewrite功能

Nginx之所以如此强大流行的还有一个原因就是拥有对用户输入的URL地址进行重写功能。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则的匹配的。默认参数编译nginx就会支持rewrite功能,但是也必须要PCRE的支持。

一、rewrite功能
  rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement,结尾是flag标记。

rewrite语法格式及参数语法说明如下:


rewrite                  [flage];

关键字         正则         替代内容            flag标记

关键字:其中关键字rewrite是不可改变的
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将被正则匹配到的内容替换成replacement
flag标记:rewrite支持的flag标记

flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

二、if判断与全局变量
if判断指令:语法为if(condition) {…},对给定的条件condition进行判断。如果条件为真,大括号内的rewrite指令将被执行。
if条件(condition)可以是如下任何内容:
  1)当表达式只是一个变量时,如果值为空或者是任何以0开头的字符串都会当做false
  2)直接比较变量和内容时,使用=或!=
  3)~ 做正则表达式匹配,~* 做不区分大小写的正则匹配,!~ 区分大小写的不匹配

-f 和 !-f 用来判断是否存在文件
-d 和 !-d 用来判断是否存在目录
-e 和 !-e用来判断是否存在文件或目录
-x 和 !-x 用来判断文件是否可执行

例如:

if ($http_user_agent ~ MSIE) {
	rewrite ^(.*)$ /msie/$1 break;
}  //如果用户的浏览器为IE,则请求的URL目录被重写到/msie目录下;

if ($request_methond = POST) {
	return 405;
}  //如果提交的方法为POST,则返回状态为405(Method  not allowed)。return不能返回301,302;

if (!-f $request_filename) {
	break;
	proxy_pass    http://127.0.0.1;
}  //如果请求的文件名不存在,则反向代理到localhost。break是停止rewrite检查;

if ($args ~ post=140) {
	rewrite ^ http://example.com/  permanent;
}  //如果请求的字符串中包含"post=140",则永久重定向到example.com

可做if判断的全局变量:

$args: 这个变量等于请求中的参数,同$query_string;
$content_length: 请求中的Content-length字段;
$contyent_type: 请求头中的Content-Type字段;
$document_root: 当请求在root指令中指定的值;
$host: 请求主机头字段,否则为服务器名称;
$http_user_agent: 客户端的agent信息;
$http_cookie: 客户端的cookie信息;
$limit_rate: 这个变量可以限制连接速率;
$request_method: 客户端请求的方法,通常为GET或POST;
$remote_addr: 客户端的IP地址信息;
$remote_port: 客户端的端口信息;
$remote_user: 已经经过Auth Basic Module验证的用户名;
$request_filename: 当前请求的文件路径,由root或alias指令与URI请求生成;
$scheme: HTTP方法(如http,https);
$server_protocol: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1;
$server_addr: 服务器地址,在完成一次系统调用之后可以确定这个值;
$server_name: 服务器名称;
$server_port: 请求到达服务器的端口号;
$request_uri: 包含请求参数的原始URL,不包含主机名,如:”/foo/bar.php?arg=baz”;
$uri: 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”;
$document_uri: 与$uri相同;

你可能感兴趣的:(运维系列)