Nginx中的location匹配和rewrite重写跳转

1、常用的Nginx正则表达式

2、location

3、rewrite

4、rewrite实例

1、常用的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] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符

  

2、location:

location大致可以分为是三类:

  1. 精准匹配:location = / {}
  2. 一般匹配:location / {}
  3. 正则匹配:location ~ / {}

location常用匹配规则:

= :进行普通字符精确匹配,也就是完全匹配。
^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。
~ :区分大小写的匹配。
~* :不区分大小写的匹配。
!~ :区分大小写的匹配取非。
!~* :不区分大小写的匹配取非。  

location优先级:     重点       

首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配

  

location示例说明:

(1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。 (2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但若后面是正则表达式会和最长字符串优先匹配(最长匹配) (3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条 (4)location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条 (5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条 (6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则 (7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在 (8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条 (9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高 优先级总结:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

 

 

实际网站使用中,至少有三个匹配规则定义 :
第一个必选规则
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
这里是直接转发给后端应用服务器了,也可以是一个静态首页

location = / {
proxy_pass http://tomcat_server/;
}

  

第二个必选规则

处理静态文件请求,这是nginx作为http服务器的强项 有两种配置模式,目录匹配或后缀匹配,
任选其一或搭配使用

location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}

  

第三个规则
通用规则
比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器 非静态文件请求就默认是动态请求

location / {
proxy_pass http://tomcat_server;
}

  

3、rewrite:

rewrite功能就是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记实现URL重写以及重定向。

例如:更换域名后需要保持旧的域名能够转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后面的除去传递的参数外的字符串起作用。

例如:http://www.lvbu.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。

a)rewrite 跳转实现
Nginx:通过ngx_http_rewrite_module模块支持URL重写、支持if条件判断,但不支持else

跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误

PCRE支持:perl兼容正则表达式的语法规则匹配

重写模块set指令:创建新的变量并为其赋值

b)rewrite执行顺序

  1. 执行server块里面的rewrite指令
  2. 执行location匹配
  3. 执行选定的location中的rewrite指令

c)rewrite语法格式

  • 语法rewrite<regex><replacement><flag>;
  • regex:表示正则匹配规则
  • replacement:表示跳转后的内容
  • flag:表示rewrite支持的flag标记

 d)flag标记说明

  • last :本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中。
  • break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
  • redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
  • permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

4、rewrite实例:

a)基于域名的跳转:

现在公司旧域名www.lvbu.com有业务需求变更,需要使用新域名www.caocao.com代替,

但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.lvbu.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.lvbu.com.access.log; #日志修改
location / {
#添加域名重定向
if ($host = 'www.lvbu.com'){ #$host为rewrite全局变量,代表请求主机头字段或主机名
rewrite ^/(.*)$ http://www.caocao.com/$1 permanent; #$1为正则匹配的内容,即域名后边的字符串
}
root html;
index index.html index.htm;
}
}

  

b)基于客户端ip访问跳转:

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :20.0.0.17访问正常。

vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.lvbu.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.lvbu.com-access.log main; #日志修改 #设置是否合法的IP标记
set $rewrite true; #设置变量$rewrite,变量值为boole值true
#判断是否为合法IP
if ($remote_addr = "20.0.0.17"){ #当客户端IP为20.0.0.17时,将变量值设为false,不进行重写
set $rewrite false;
}
#除了合法IP,其它都是非法IP,进行重写跳转维护页面
if ($rewrite = true){ #当变量值为true时,进行重写
rewrite (.+) /weihu.html; #重写在访问IP后边插入/weihu.html,例如20.0.0.18/weihu.html
}
location = /weihu.html {
root /var/www/html; #网页返回/var/www/html/weihu.html的内容
} location / {
root html;
index index.html index.htm;
}
}
mkdir -p /var/www/html/
echo 'hello weihu!' > /var/www/html/weihu.html
systemctl restart nginx

  

  

c)基于旧域名跳转到新域名后面加目录:

现在访问的是 http://caocao.lvbu.com,现在需要将这个域名下面的访问都跳转到http://www.lvbu.com/caocao

vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name caocao.lvbu.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.lvbu.com-access.log;
#添加
location /post {
rewrite (.+) http://www.lvbu.com/caocao$1 permanent; #这里的$1为位置变量,代表/post
} location / {
root html;
index index.html index.htm;
}
}
mkdir -p /usr/local/nginx/html/kiki/post
systemctl restart nginx.service

  

 d) 基于参数匹配的跳转:

现在访问http://www.lvbu.com/100-(100|200)-100.html 跳转到http://www.lvbu.com页面。

vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.lvbu.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.lvbu.com-access.log main; if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
rewrite (.+) http://www.lvbu.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
systemctl restart nginx

  

e)基于目录下所有 php 结尾的文件跳转 :

要求访问 http://www.lvbu.com/upload/123.php 跳转到首页。

vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.lvbu.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.lvbu.com-access.log main; location ~* /upload/.*\.php$ {
rewrite (.+) http://www.lvbu.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
systemctl restart nginx

  

f)基于最普通一条 url 请求的跳转:

要求访问一个具体的页面如 http://www.lvbu.com/abc/123.html 跳转到首页

vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.lvbu.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.lvbu.com-access.log main; location ~* ^/abc/123.html {
rewrite (.+) http://www.lvbu.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
systemctl restart nginx

  

Nginx中的 location 匹配和 rewrite 重写跳转的更多相关文章

  1. Nginx中location匹配及rewrite重写

    目录 一.常用的Nginx正则表达式 二.location 2.1.location三类匹配类型 2.2.常用的匹配规则 2.3.location优先级 2.3.1.举例说明 2.4.实际网站使用中, ...

  2. nginx中的location匹配规则

    概述: 1. location在nginx配置文件中的作用是根据用户请求的URI来执行不同的应用. 2.URI的定义:标识.定位任何资源的字符串 协议://域名/目录a/目录b/文件c http:// ...

  3. Nginx中的Location和Rewrite

    Nginx中的Location和Rewrite 目录 Nginx中的Location和Rewrite 一.location 1. location的分类 2. location常用的匹配规则 3. l ...

  4. Nginx教程(四) Location配置与ReWrite语法

    Nginx教程(四) Location配置与ReWrite语法 1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {- } ...

  5. Nginx教程(四) Location配置与ReWrite语法 (转)

    Nginx教程(四) Location配置与ReWrite语法 1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {… } ...

  6. Nginx 配置指令location 匹配符优先级和安全问题【转】

    Nginx配置指令location匹配符优先级和安全问题 使用nginx 很久了,它的性能高,稳定性表现也很好,得到了很多人的认可.特别是它的配置,有点像写程序一样,每行命令结尾一个";&q ...

  7. nginx location匹配及rewrite规则

    location匹配规则 1. 实例 server{ location = \ { [配置A] } location / { [配置B] } location = /images/ { [配置C] } ...

  8. Nginx中的一些匹配顺序

    Nginx中经常需要做各种配置,总结如下: 1.server_name配置 nginx中的server_name指令主要用于配置基于名称虚拟主机,同一个Nginx虚拟主机中,可以绑定多个server_ ...

  9. 转:Nginx配置指令location匹配符优先级和安全问题

    转:http://www.jb51.net/article/47761.htm 使用nginx 很久了,它的性能高,稳定性表现也很好,得到了很多人的认可.特别是它的配置,有点像写程序一样,每行命令结尾 ...

随机推荐

  1. 分布式抽奖秒杀系统,DDD架构设计和实现分享

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.用大项目,贯穿知识体系 写CRUD.堆API.改屎山⛰,熬多少个996也只是成为重复的螺丝 ...

  2. 怎样安装python的 模块、 包、 库方法总结

    pip install 模块,这种输入命令回车后 1.pip install six 回车,安装成功后显示sucess 2.pip install lxml 回车,显示正在下载中的,可将这个下载地址复 ...

  3. spring boot 使用 mybatis 开启事务回滚 的总结

    1.前言 以前没有使用mybatis,可以关闭自动提交,然后做sql操作,对操作进行catch捕获异常, 如果没有异常则commit 提交 ,有异常则 rollback 回滚,新增的数据则删除 ,修改 ...

  4. c# - 按引用内存地址传参 和 按输出传参 的具体使用

    1.前言 传递参数,不需要返回值,对懒人很舒服哟,缺点是不好定位数据 2.操作 using System; namespace ConsoleApp1.letVlaueGo { public clas ...

  5. centos7 配置登录前和登录信息内容

    登录之前提示信息: 登录之后提示信息: 上述中,只需修改对应的文件即可. 登录之前: vi /etc/issue 登录之后: vi /etc/motd 补充:将文件内容清空的方法,不是删除. 在前面文 ...

  6. k8s中初始化容器(init container)的作用及其使用方法

    概述 在容器的部署过程中,有的时候需要在容器运行之前进行一些预配置的工作,比如下载配置,判断某些服务是否启动,修改配置等一些准备的工作,想要实现这些功能,在k8s中可以使用初始化容器,在应用容器运行之 ...

  7. kafka时间轮简易实现(二)

    概述 上一篇主要介绍了kafka时间轮源码和原理,这篇主要介绍一下kafka时间轮简单实现和使用kafka时间轮.如果要实现一个时间轮,就要了解他的数据结构和运行原理,上一篇随笔介绍了不同种类的数据结 ...

  8. Mysql存储过程二

    1.MySQL中创建存储过程时通过DEFINER和SQL SECURITY设置访问权限 procedure与function.trigger等创建时紧接着CREATE都有个definer可选项,该de ...

  9. 《剑指offer》面试题07. 重建二叉树

    问题描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍 ...

  10. Linux命令(2)--cp拷贝、mv剪切、head、tail追踪、tar归档

    文章目录 一.知识回顾 ls cd 二.Linux基本操作(二) 1.cp 拷贝 2.mv 移动(剪切) 3.head 头部 4.tail 追踪(尾部) 5.tar 归档 查看 压缩 解压 总结 一. ...