目录
1.常用的Nginx 正则表达式
^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字[0-9] \s :空白符 \w :任意单词字符包括下划线[A-Za-z0-9_]
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符
从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。
rewrite 对访问的域名或者域名内的URL路径地址重写
location 对访问的路径做访问控制或者代理转发
2.location
location 通过前缀或正则匹配用户的URL访问路径做页面跳转、访问控制和代理转发
location URL路径 #一般前缀匹配
location = URL路径 #精准匹配
location ^~ URL路径 #前缀匹配
location ~ URL路径 #正则匹配,区分大小写
location ~* URL路径 #正则匹配,不分区大小写
location !~ URL路径 #正则匹配取反
location !~* URL路径 #正则匹配取反,不分区大小写
location匹配机制:
优先级:精准匹配 = > 最长前缀匹配 ^~ > 正则匹配 ~ ~* !~ !~* > 一般前缀匹配 /XXXX > 通用匹配 /
注:在没有合适的精准匹配的情况下,先看前缀匹配的长度,取最长匹配的location(如果此最长匹配是带有^~的则不再看正则匹配;如果此最长匹配是不带有^~的则会继续再看正则匹配)
前缀匹配看长度,最长的优先匹配;正则匹配看上下顺序,根据nginx配置文件的配置由上往下依次匹配,匹配到即停止
#网站首页匹配
location = / {
root 网页根目录;
index index.html;
}
#网站静态页面,通过前缀匹配或通用匹配在nginx服务器本地处理
location ~ /static/ {
root 目录;
}
location / {
root 目录;
}
#网站动态页面,通过匹配不同的动态网页文件后缀转发给不同的后端应用服务器处理
location \.php$ {
fastcgi_pass PHP服务器地址:端口;
}
location \.jsp$ {
proxy_pass TOMCAT服务器地址:端口;
}
3.rewrite
rewrite 对用户的URL访问路径进行重写,再重定向跳转访问重写后的路径
rewrite格式
rewrite 正则表达式 重写的地址 [标记位];
标记位 | |
---|---|
last | 本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中 |
break | 本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中 |
permanent | 返回302临时重定向,浏览器地址会显示跳转后的URL地址 |
redirect | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 |
rewrite默认情况下只对从域名后面的根目录 / 开始到传递参数的 ? 号前面的URL路径进行重写
##默认只对域名后面的URL部分重写
rewrite 正则表达式 /新URL;
http://域名/旧URL -> http://域名/新URL
##如果需要全域名路径重写需要加上协议和域名
rewrite 正则表达式 http://新域名/新URL;
http://旧域名/旧URL -> http://新域名/新URL;
http://域名/旧URL --rewrite重写--> http://域名/新URL --> location匹配新URL路径跳转页面
rewrite 正则表达式 /新URL permanent; #重写后会修改浏览器里的地址栏再重新访问
http://域名/旧URL --rewrite重写--> http://域名/新URL --> 浏览器地址栏也会改为 http://域名/新URL 再发起一次访问请求 --> location匹配新URL路径跳转页面
location ~ URL路径正则表达式 {
rewrite 正则表达式 重写的地址 [标记位];
}
$request_uri
if ($uri ~ URL路径正则表达式) {
rewrite 正则表达式 重写的地址 [标记位];
}
$request_uri:包含请求参数的原始URI,不包含主机名
$uri:这个变量指当前的请求URI,不包括任何参数
$document_uri:与$uri相同,这个变量指当前的请求URI,不包括任何传递参数