nginx URL重写模块(Rewrite)

官方文档 http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

中文文档 http://www.nginx.cn/doc/standard/httprewrite.html

翻译比较详细中文文档 http://shouce.jb51.net/nginx/StandardHTTPModules/Rewrite.html

建议两个文档个都看看防止遗漏中文文档不全
 

Rewrite模块

用来执行URL重定向。这个机制有利于去掉恶意访问的url,也有
利于搜索引擎优化(SEO)。
Nginx使用的语法源于Perl兼容正则表达式(PCRE)库,基本语法如下:
^ :必须以^后的实体开头
$ :必须以$前的实体结尾
. :匹配任意字符
[ ] :匹配指定字符集内的任意字符
[^ ] :匹配任何不包括在指定字符集内的任意字符串
| :匹配 | 之前或之后的实体
() :分组,组成一组用于匹配的实体,通常会有|来协助
n 捕获子表达式,可以捕获放在()之间的任何文本,比如:
^(.*)(hello|sir)$ 字符串为“hi sir” 捕获的结果: $1=hi $2=sir
这些被捕获的数据,在后面就可以当变量一样使用了

内部请求
外部请求是客户端的url,内部请求是Nginx通过特殊的指令触发。
比如:error_page、index、rewrite、try_files、include等等
内部请求分成两种类型
1:内部重定向:URI被改变,可能会匹配到其他的Location
2:子请求:比如使用Addition模块,指令add_after_body允许你在原始的URI之
后指定一个URI,会把该URI被处理后的结果,插入到原始的URI的body中。
内部重定向示例:
server {
    server_name sishuok.com;
        location /abc/ {
        rewrite ^/abc/(.*)$ /bcd/$1
    }
    location /bcd/{
        internal;
        root pages;
    }
}
条件结构的基本语法:
1:没有操作符:指定的字符串或者变量不为空,也不为0开始的字符串,取true
2:= , != ,例:if($request_method = POST){…}
3:~,~*,!~,!~* ,例:if($uri ~* “\.jsp$”){…}
4:-f,!-f :用来测试指定文件是否存在,例:if(-f $request_filename){…}

正则表达式的一部分可以用圆括号,方便之后按照顺序用$1-$9来引用。
示例配置:

if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;
}
 
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
  set  $id  $1;
}
 
if ($request_method = POST ) {
  return 405;
}
 
if (!-f $request_filename) {
  break;
  proxy_pass  http://127.0.0.1;
}
 
if ($slow) {
  limit_rate  10k;
}
 
if ($invalid_referer) {
  return   403;
}
 
if ($args ~ post=140){
  rewrite ^ http://example.com/ permanent;
}

内置变量$invalid_referer用指令valid_referers指定。


5:-d,!-d :用来测试指定目录是否存在
6:-e,!-e:用来测试指定文件、目录或者符号链接是否存在
7:-x,!-x:用来测试指定文件是否存在和是否可以执行
8:break:跳出if块

使用字段:server, location, if 
完成当前设置的规则,停止执行其他的重写指令。

9:return:终止处理,并返回一个指定的http状态码

这个指令结束执行配置语句并为客户端返回状态代码,可以使用下列的值:204,400,402-406,408,410, 411, 413, 416与500-504。此外,非标准代码444将关闭连接并且不发送任何的头部。
10:set:初始化或者重定义一个变量

你可能感兴趣的:(nginx)