Nginx--rewrite
rewrite URL重写,可以在改变网站结构后,无需要求客户端用户修改原有的浏览器书签,也无需其他网站修改对我们网站的友情链接,依赖于PCRE库的支持
1 if
语法: if (condition) { ... } 默认值: — 上下文: server, location 如果condition为真,执行定义在大括号中的rewrite模块指令。if指令会从上一层配置中继承配置 condition可以是下列任意一种: • 变量名: 如果变量值为空或者为“0” 则条件为假; • 使用“=”和“!=”运算符比较变量和字符串; • 使用“~”(大小写敏感)和“~*”(大小写不敏感)运算符匹配变量和正则表达式。正则表达式可以包含匹配组,匹配结果后续可以使用变量$1..$9引用。如果正则表达式中包含字符“}”或者“;”,整个表达式应该被包含在单引号或双引号的引用中 • 使用“-f”和“!-f”运算符检查文件是否存在; • 使用“-d”和“!-d”运算符检查目录是否存在; • 使用“-e”和“!-e”运算符检查文件、目录或符号链接是否存在; • 使用“-x”和“!-x”运算符检查可执行文件;
例: if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 last; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; }
2 rewrite
rewrite指令可以说是rewrite指令集中的核心指令,它通过正则表达式的使用改变URI 可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理 1.先执行server中的rewrite(如果有的话),得到新的URI, 只执行一次(无论修饰符是last还是break); 2.在location中匹配新的URI; 3.执行location中的rewrite(如果有的话), 如果修饰符是last,重写之后得到新的URI, 再在location中匹配新的URI; 如果修饰符是break,重写后得到新的URI,不再进行location匹配
语法: rewrite regex replacement [flag]; regex - 用于匹配URI的正则表达式。使用"()"标记要截取的内容 注意: rewrite 接受到的URL不包含HOST地址和参数,因此regex不可能匹配到URI的HOST地址或参数 如: 请求的URL为http://myweb.com/source?arg1=value1&arg2=value2 此时rewrite指令接受到的URI 是 "/source", 而不包含"myweb.com",也不包含"?arg1=value1&arg2=value2" replaement - 匹配成功后用于替换URI 中被截取内容的字符串 默认情况下,如果该字符串是由"http://" 或"https://" 开头的, 则不会继续对URI 进行处理,而是直接将重写后的URI返回给客户端。 flag - 有break、last、permanent、redirect last - 停止执行当前这一轮的ngx_http_rewrite_module指令集,然后查找匹配改变后URI的新location; break - 停止执行当前这一轮的ngx_http_rewrite_module指令集; redirect - 返回状态码为302的临时重定向; permanent - 返回状态码为301的永久重定向
例: 1.如果UA包含"MSIE",rewrite请求到/msie/目录下 if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } 2.如果query string中包含"post=140",则永久重定向到example.com if ($args ~ post=140) { rewrite ^ http://example.com/ permanent; }