娃哈哈好喝-真的!
技术够用就行,吃好喝好睡好!

nginx正则表达式详解

一.正则表达式匹配:
~             为区分大小写匹配
~*     为不区分大小写匹配
!~和!~* 分别为区分大小写不匹配及不区分大小写不匹配
.     匹配除换行符以外的任意字符
\w     匹配字母或数字或下划线或汉字
\s     匹配任意的空白符
\d     匹配数字
\b     匹配单词的开始或结束
^     匹配字符串的开始
$     匹配字符串的结束
*     重复零次或更多次
+       重复一次或更多次
?         重复零次或一次
{n}       重复n次
{n,}     重复n次或更多次
{n,m}     重复n到m次
*?       复任意次,但尽可能少重复
+?       重复1次或更多次,但尽可能少重复
??       重复0次或1次,但尽可能少重复
{n,m}?   重复n到m次,但尽可能少重复
{n,}?     重复n次以上,但尽可能少重复
\W       匹配任意不是字母,数字,下划线,汉字的字符
\S       匹配任意不是空白符的字符
\D       匹配任意非数字的字符
\B       匹配不是单词开头或结束的位置
[^x]     匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符    
(exp)         匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp)
(?:exp)       匹配exp,不捕获匹配的文本,也不给此分组分配组号    
(?=exp)       匹配exp前面的位置
(?<=exp)     匹配exp后面的位置
(?!exp)       匹配后面跟的不是exp的位置
(?<!exp)     匹配前面不是exp的位置
(?#comment)   注释分组不对正则表达式的处理产生任何影响
二.文件及目录匹配:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
三.rewrite指令的最后一项参数为flag标记,flag标记有:
1.last    相当于apache里面的[L]标记,表示rewrite。
2.break本条规则匹配完成后,终止匹配,不再匹配后面的规则。
3.redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
4.permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址。
四. 语法规则: 【= | ^~ | ~ | ~* | / | /uri 】
location = /uri        = 表示精确匹配,只有完全匹配上才能生效,若找到,停止搜索; 
location ^~ /uri       ^~开头表示对URL路径进行前缀匹配,并且在正则匹配之前,若找到,停止搜索;
location ~ pattern     ~开头表示区分大小写的正则匹配,按配置文件顺序匹配;
location ~* pattern   ~*开头表示不区分大小写的正则匹配,按配置文件顺序匹配;
location /uri         不带任何修饰符,表示前缀匹配,在正则匹配之后;
location /             通用匹配,任何未匹配到其他location的请求都会匹配到,相当于default;
五. 多个location配置的情况匹配顺序为
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!~ 和!~* 分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
六.案例

nginx中rewrite 一些简单重写 禁止.mp3.sh访问

location ~ .*\.(mp3|sh)$
{
return 403;
}

目录/hometest/ 重定向到 /www/temp/

rewrite ^/([0-9a-z]+)test/$    /www/$1 permanent;

例如: 访问 ceshitest.com/uuu/ 结果重定向到 ceshitest.com/www/uuu/ 文件/ceshi-123-456-789.html 重定向到 /ceshi/123/456/789.html

rewrite ^/ceshi-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /ceshi/$1/$2/ceshitest_$3.html permanent;

根据表达式来重定向URI及修改字符串,只对相对路径有效;如果想配对主机名,需使用if语句,示例如下:

if( $host ~* www\.(.*)\.(.*)$)
{
set $test1 $1;
set $test2 $2;
rewrite ^(.*)$ http://t=$test1&m=$test2 permanent;
}
赞(0)
未经允许不得转载:娃哈哈好喝 » nginx正则表达式详解
分享到: 更多 (0)