一、常见的nginx正则表达式
^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符
二、location
1、location大致可以分为三类
精准匹配:location = / { ... }
一般匹配:location / { ... }
正则匹配:location ~ / { ... }
2、location常用的匹配规则
= :进行普通字符精确匹配,也就是完全匹配。
^~ :表示普通字符匹配,使用前缀匹配,如果匹配成功,则不再匹配其它location
~ :区分大小写的匹配
~* :不区分大小写的匹配
!~ :区分大小写的匹配取非
!~* :不区分大小写的匹配取非
3、location 匹配优先级
首先精确匹配 =
其次前缀匹配 ^~
其次按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰符的前缀匹配
最后是交给 / 通用匹配
3.1 location 示例说明
① location = / {}
- =为精准匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data ,则 / 匹配 ,/data 不匹配。再比如 location = /abc ,则只匹配/abc,/abc/或/abcd 不匹配。若location /abc ,则匹配 /abc 、/abcd/ 、/abc/。
② location / {}
- 因为所有的地址都是以 / 开头,所以这条规则将匹配到所有普请求,比如访问 / 和 /data ,则 / 匹配,/data 也匹配。 但若后面还有正则表达式和最长字符,则优先匹配(最长匹配)
③location /documents/ {}
- 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location,只有其它 location 后面的正则表达式 没有匹配到时,才会采用这一条。
④location /documents/abc {}
- 匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location ,只有其它 location 后面的正则表达式没有匹配到时,才会采用这一条。
⑤ location ^~ /images/ {}
- 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,直接采用这一条。
⑥ location ~ \.(gif|jpg|jpeng)$ {}*
- 匹配所有以gif、jpg或jpeng结尾的请求,然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为^~ 的优先级更高,所以到达不了这一条正则。
⑦ location /images/abc {}
- 最长字符匹配到 /images/abc ,优先级最低,继续往下搜索其它 location,会发现 ^~ 和~ 存在
⑧ location ~ /images/abc {}
- 匹配以/images/abc 开头的,优先级次之,只有去掉location ^~ /images/ 才会采用这一条
⑨ location /images/abc/1.html {}
- 匹配 /images/abc/1.html 文件,如果和正则 location ~ /images/abc/1.html 相比,正则优先级更高
3.1 优先级总结(重点)
(location = 完整路径)> (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (location / )
location 匹配
- 首先看优先级: 精确 > 前缀 > 正则 > 通用
- 优先级相同: 正则看上下顺序,上面的有限;一般匹配看长度,最长匹配的有限
- 精确、前缀、正则、一般 都没有匹配到,最后再看通用匹配
4、三个匹配规则定义
在实际网站使用中,至少有三个匹配规则定义
4.1 直接匹配网站根
- 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如官网。
- 可以是一个静态首页,也可以直接转发给后端应用服务器。
location = / {
root html;
index index.html index.html;
}
4.2 处理静态文件请求
- 这是nginx作为http服务器的强项
- 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(html|gif|jpg|jpeg|peng|css|js|ico)$ {
root /webroot/res/;
}
4.3 通用规则
- 比如用来转发带.jpg、.jsp 后缀的动态请求到后端应用服务器
- 非静态文件请求就是默认是动态请求
location / {
proxy_pass http://tomcat_server;
}
三、rewrite
功能:使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
- 比如:更换域名后需要保持旧的域名能跳转到新的域名上,某网页发生改变需要跳到新的页面、网站防盗链等等需求
rewrite 只能放在server{},location {},if{}中,并且默认只能对域名后边的除去传递参数外的字符串起作用。
- 例如 http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对 /abc/bbs/index.php 重写。
1、rewrite 跳转实现(重点)
- nginx: 通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
- 跳转: 从一个location 跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
- PCRE支持: perl兼容正则表达式的语法规则匹配。
- 重写模块set指令: 创建新的变量并设其值。
2、 rewrite 执行顺序如下
- 执行server块里面的rewrite指令。
- 执行location 匹配
- 执行选定的location 中的rewrite 指令。
3、语法格式
rewrite 【regex】 【replacement】 【flag】
- regex : 表示正则匹配规则
- replacement : 表示跳转后的内容
- flag : 表示rewrite支持的flag标记
4、flag标记说明
- last : 条规则匹配完成后,继续向下匹配新的location URL 规则,一般用来server和 if 中。
- break : 本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在location中
- redirect : 返回302临时重定向,浏览器地址会显示跳转后的URL地址
- permanent: 返回301永久重定向,浏览器地址栏会显示跳转后的URL
四、location和rewrite的区别
从功能上看rewrite 和location似乎有点像,都能实现跳转
主要区别
- rewrite 是同一域名内更改获取资源的路径
- location是对一类路径做控制访问或反向代理,还可以proxy_pass 到其它及其。
五、rewrite示例
1、基于域名的跳转
现在公司旧域名www.ydq.com 有业务需求变更,需要使用新域名 www.yudeqiang.com 代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
在nginx配置文件中进行修改内容
server {
listen 80;
server_name www.ydq.com;
charset utf-8;
access_log logs/www.ydq.com.access.log;
location / {
if ($host = 'www.ydq.com'){
rewrite ^/(.*)$ http://www.yudeqiang.com/$1 permanent;
}
root html;
index index.html index.htm;
}
网页访问:www.ydq.com/test/1.html 查看对应内容网址。
2、基于ip的跳转
今天公司业务新版本上线,要求所有IP访问任何内容都显示一个维护页面,只有公司ip:20.0.0.55访问正常。
server {
listen 80;
server_name www.ydq.com;
charset utf-8;
access_log logs/www.ydq.com.access.log;
set $rewrite true;
if ($remote_addr = '20.0.0.55'){
set $rewrite false;
}
if ($rewrite = true){
rewrite (.+) /test/1.html;
}
location = /test/1.html{
root /usr/local/nginx/html;
}
location / {
root html;
index index.html index.htm;
}
客户端访问
3、基于旧域名跳转到新域名后面家目录
现在访问的是:http://bbs.ydq.com/post/ 现在需要将这个域名下面的访问都跳转到http://www.ydq.com/bbs/post/ 。
server {
listen 80;
server_name www.ydq.com;
charset utf-8;
access_log logs/www.ydq.com.access.log;
location /post {
rewrite (.+) http://www.ydq.com/bbs$1 permanent;
}
location / {
root html;
index index.html index.htm;
}
4、基于参数匹配的跳转
现在访问http://www.ydq.com/100-(100|200)-100.html 跳转到 http://www.ydq.com页面
server {
listen 80;
server_name www.ydq.com;
charset utf-8;
access_log logs/www.ydq.com.access.log;
if ($request_uri ~ ^/100-(100|200)-(\d+).html$){
rewrite (.+) http://www.ydq.com permanent;
}
location / {
root html;
index index.html index.htm;
}
注意:$request_uri :包含请求参数的原始URI,不包含主机名。
如:http://www.ydq.com/abc/bbs/index.html?a=1&b=2 中,就是:/abc/bbs/index.php?a=1&b=2
$uri: 这个变量指当前的请求URI,不包括主机名和参数,就是:/abc/bbs/index.html
$document_uri:与$uri相同,这个变量指当前的请求URI,不包括任何传递参数,就是:/abc/bbs/index.html
nginx服务器设置
5、基于目录下所有php结尾的文件跳转
要求访问http://www.ydq.com/upload/123.php 跳转到首页(www.ydq.com)
server {
listen 80;
server_name www.ydq.com;
charset utf-8;
access_log logs/www.ydq.com.access.log;
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.ydq.com permanent;
}
location / {
root html;
index index.html index.htm;
}
修改配置文件
6、最普通的一条URL请求跳转
要访问一个具体的页面,如httpd://www.ydq.com/abc/123.html 跳转到首页
方法一:
server {
listen 80;
server_name www.ydq.com;
charset utf-8;
access_log logs/www.ydq.com.access.log;
location ~* ^/abc/123.html {
rewrite (.+) http://www.ydq.com;
}
location / {
root html;
index index.html index.htm;
}
配置文件修改]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/75035.html