Nginx跳转模块之location与rewrite
创始人
2025-05-28 14:16:11
0

目录

一.location模块与rewrite模块区别

二.location模块的基本介绍

1.location模块是什么?

2.三种匹配类别

3.常用的匹配规则

4.匹配优先级

三.location模块使用实例

1.精确匹配优先级小于一般匹配的特殊情况

2.解决方法

3.实际网站使用中的三个匹配规则

四.rewrite模块的基本介绍

1.rewrite功能

2.跳转场景

3.跳转实现

4.执行顺序

5.语法格式

五.rewrite模块使用实例

1.基于域名的跳转

旧域名有业务需求变更,需要使用新域名代替,但是旧域名不能废除,需跳转到新域名上,且后面的参数保持不变

2.基于客户端 IP 访问跳转

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

3. 基于旧域名跳转到新域名后面加目录

访问mail.jiu.com/post,将这个域名下的访问都跳转到www.jiu.com

4.基于参数匹配的跳转

访问www.jiu.com/100-(100|200)-100.html 跳转到www.jiu.com页面

5.基于目录下所有 php 结尾的文件跳转

访问www.kgc.com/upload/123.php 跳转到首页

6.基于最普通一条 url 请求的跳转

访问一个具体的页面如www.kgc.com/abc/123.html 跳转到首页


一.location模块与rewrite模块区别

从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

rewrite:对访问的域名或者域名内的URL路径地址重写
location:对访问的路径做访问控制或者代理转发

二.location模块的基本介绍

1.location模块是什么?

location块是server块的一个指令。作用:基于Nginx服务器接收到的请求字符串,虚拟主机名称(ip,域名)、url匹配,对特定请求进行处理。

2.三种匹配类别

精准匹配:location = / {}

一般匹配:location / {}

正则匹配:location ~ / {}

location常用正则表达式:

匹配符表示含义
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
?匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
.表示任意一个字符
\转义字符用于取消特殊符号的含义
\d匹配纯数字
\s匹配空的(空格或者制表符)
{n}匹配前面的子表达式n次
{n,}匹配前面的子表达式不少于n次
{n,m}匹配前面的子表达式n到m次
[ ]匹配括号中的一个字符
[c]匹配单个字符 c
[a-z]匹配 a-z 小写字母的任意一个
[a-zA-Z0-9]匹配所有大小写字母或数字
()表达式的开始和结束位置
|或运算符

3.常用的匹配规则

规则表达式规则含义
=进行普通字符精确匹配。也就是完全匹配
^~表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他 location
~表示执行一个正则匹配,区分大小写
~*表示执行一个正则匹配,不区分大小写
!~表示执行一个正则匹配,区分大小写不匹配
!~*表示执行一个正则匹配,不区分大小写不匹配

4.匹配优先级

首先精确匹配 =

其次前缀匹配 ^~

其次是按文件中顺序的正则匹配 ~或~*

然后匹配不带任何修饰的前缀匹配

最后是交给 / 通用匹配

(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 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

优先级总结
(location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

location 匹配
首先看 优先级:精确= > 前缀^~ > 正则~,~* > 一般 > 通用/
优先级相同:正则看上下顺序,上面的优先;一般匹配看长度,最长匹配的优先
精确、前缀、正则、一般 都没有匹配到,最后再看通用匹配

三.location模块使用实例

1.精确匹配优先级小于一般匹配的特殊情况

location = / {} 和 location / {} ,按道理应匹配前者,但实际确实匹配后者,匹配只写域名精确匹配不生效

1. #在配置文件添加匹规则
vim  /usr/local/nginx/conf/nginx.conf#默认网页location / {root   html;index  index.html index.htm;        }#添加的网页location = / {     root   /web/test/;}2. #新建网页站点目录
mkdir -p /web/test3. #在站点目录下新建index.html
vim /web/test/index.htmlThis is a test!4. #检查语法并重启
nginx -t
systemctl restart nginx.service 5. #在网页中测试
192.168.79.210

2.解决方法

在 /根后 加上index.html 后生效

1. #修改配置文件
vim  /usr/local/nginx/conf/nginx.conflocation = /index.html {            # 加上index.html root   /web/dog/;}2. #检查语法、重启服务
nginx -t
systemctl restart nginx.service 3. #网页测试
192.168.79.210

3.实际网站使用中的三个匹配规则

3.1 第一个必选规则

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
这里是直接转发给后端应用服务器了,也可以是一个静态首页

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

3.2 第二个必选规则是处理静态文件请求

这是nginx作为http服务器的强项!
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

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

3.3 第三个通用规则

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

location / {proxy_pass http://tomcat_server;
}

四.rewrite模块的基本介绍

1.rewrite功能

现在 Nginx 已经成为很多公司作为前端反向代理服务器的首选,在实际工作中往往会 遇到很多跳转(重写 URL)的需求比如更换域名后需要保持旧的域名能跳转到新的域名 某网页发生改变需要跳转到新的页面、网站防盗链等等需求。如果在后端使用的 Apache 服务器,虽然也能做跳转,规则库也很强大,但是用 Nginx 跳转效率会更高,这也是学习 本章的目的所在。

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求

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

2.跳转场景

Rewrite 跳转场景主要包括以下几种

  1. 可以调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求

  2. 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态 URL 地址伪装成静态地址提供服务

  3. 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com会跳转到 jd.com

  4. 根据特殊变量、目录、客户端的信息进行 URL 调整等。

3.跳转实现

  • Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
  • 跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
  • PCRE支持:perl兼容正则表达式的语法规则匹配
  • 重写模块 set 指令:创建新的变量并设其值

4.执行顺序

首先  执行 server 块里面的 rewrite 指令。
其次  执行 location 匹配。
最后  执行选定的 location 中的 rewrite 指令

5.语法格式

rewrite   [flag];
regex :表示正则匹配规则。
replacement :表示跳转后的内容。
flag :表示 rewrite 支持的 flag 标记。

flag标记说明

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

五.rewrite模块使用实例

1.基于域名的跳转

现在公司旧域名www.jiu.com有业务需求变更,需要使用新域名www.xin.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

第一步:修改主配置文件

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

第二步:创建所需目录与文件 

#创建日志文件夹,检查语法
mkdir -p /var/log/nginx
nginx -t#创建网页test目录与文件1.html
mkdir -p /usr/local/nginx/html/test
vim /usr/local/nginx/html/test/1.html
------------------------------------------

Here is the content of test

第三步:添加域名与IP地址映射关系

#添加映射关系
echo "192.168.79.210 www.jiu.com www.xin.com" >> /etc/hosts#重启服务
systemctl restart nginx					

第四步:网页验证

#打开浏览器输入
www.jiu.com/test/1.html会发现重定向到www.xin.com/test/1.html

2.基于客户端 IP 访问跳转

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

第一步:修改主配置文件

vim /usr/local/nginx/conf/nginx.conf
--------------------------------------------------------------
server {listen       80;server_name  www.jiu.com;												#域名修改	charset utf-8;access_log  /var/log/nginx/www.kgc.com-access.log;				#日志修改#设置是否合法的IP标记set $rewrite true;							#设置变量$rewrite,变量值为boole值true#判断是否为合法IPif ($remote_addr = "192.168.79.210"){		#当客户端IP为192.168.80.200时,将变量值设为false,不进行重写set $rewrite false;}#除了合法IP,其它都是非法IP,进行重写跳转维护页面if ($rewrite = true){						#当变量值为true时,进行重写rewrite (.+) /weihu.html;				#重写在访问IP后边插入/weihu.html,例如192.168.80.11/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/
vim /var/www/html/weihu.html
-----------------------------------

Sorry! We are busy now! See you tomorrow!

-----------------------------------systemctl restart nginx

第三步:网页验证 

#本机网页浏览器输入
www.jiu.com
访问应正常#在其他设备浏览器访问测试首先修改映射文件
echo "192.168.79.210 www.jiu.com" >>/etc/hosts#浏览器测试
www.jiu.com

 

3. 基于旧域名跳转到新域名后面加目录

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

第一步:修改主配置文件

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

第二步:添加临时域名和IP的映射关系

vim /etc/hosts
--------------
192.168.79.210 www.jiu.com mail.jiu.com

第三步:创建准备的网页文件

mkdir -p /usr/local/nginx/html/mail/post
vim /usr/local/nginx/html/mail/post/1.html
-------------------------------------------

hi

--------------------------------------------- nginx -t systemctl restart nginx

第四步:浏览器验证

输入mail.jiu.com/post/1.html
显示为www.jiu.com/mail/post/1.html

4.基于参数匹配的跳转

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

第一步:修改主配置文件

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

第二步:检查语法并重启服务

nginx -t
systemctl restart nginx

第三步:网页验证

#在浏览器输入
www.jiu.com/100-200-100.html

#在浏览器输入错误范围
www.jiu.com/100-500-100.html

5.基于目录下所有 php 结尾的文件跳转

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

第一步:修改主配置文件

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

第二步:检查语法并重启服务

nginx -t
systemctl restart nginx

第三步:网页验证

#在浏览器输入
www.jiu.com/upload/123.php

6.基于最普通一条 url 请求的跳转

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

第一步:修改主配置文件

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

第二步:检查配置文件并且重启服务

nginx -t
systemctl restart nginx

第三步:浏览器中访问测试

#在浏览器输入
www.jiu.com/abc/123.html

相关内容

热门资讯

动漫设计与制作专业个人简历 动漫设计与制作专业个人简历模板  时间过得可真快,从来都不等人,没想到也到了自己找工作的时间,现在的...
我的简历 我的简历我的简历1我19××年出生于××省××市一位工人的家庭,19××年毕业于××小学,19××年...
个人求职简历范文   个人求职简历不会写?下面unjs小编为大家整理的个人求职简历范文,欢迎阅读借鉴,祝愿面试成功! ...
摄影师助理简历个人能力介绍   摄影师助理简历个人能力介绍(一)  语言能力  外语: 英语 一般  国语水平: 精通 粤语水平...
英文简历 英文简历范文4篇  写英文简历应聘者完全可以根据个人的具体情况来确定采用何种形式,灵活设计。下面小编...
邀约面试短信模板 一、您好,我们在XX网站上有看到您的简历,仔细评估后,觉得您和我们的XX岗位有比较高的匹配度,所以想...
自我评价怎么写最好   CN人才网为您编辑了自我评价怎么写最好内容,敬请关注!!  在简历中一般都会有自我评价一栏,很多...
少儿美术老师简历 少儿美术老师简历  时光在流逝,从不停歇,迎接我们的将是新的工作机会,新的`挑战,这时是不是该好好写...
个性简历封面图片(2)   这是中国人才网个人简历频道小编为你提供个性简历封面图片,可以右击另存为桌面,即可下载使用,我们会...
医学研究生个人简历 医学研究生个人简历(通用5篇)  时光在流逝,从不停歇,相信很多朋友又忙着找工作呢吧,现在的你想必是...
简历个人简介怎么写 简历个人简介怎么写  个人简历也称为个人履历,是指求职者在求取或是转换工作岗位时向用人单位证明自己工...
品管员个人简历 品管员个人简历  个人信息  性别:男  年龄:42岁民族:汉族  工作经验:10年以上居住地:浙江...
简历封面背景图片素材下载 简历封面背景图片素材下载  传统的个人简历虽然说比较没有什么新意,但是也是非常实用的一种简历。当然也...
个人简历专业实践经历 个人简历专业实践经历范文一2001.1-至今:某软件公司 | 行政人事部部长 | 北京制定公司的管理...
求职自荐书 求职自荐书范文  以下是由unjs小编为大家推荐的求职自荐书范文,欢迎大家借阅参考,求职自荐书范文。...
程序员简历 程序员简历15篇  光阴迅速,一眨眼就过去了,眼见着,找工作的时间马上到来,你的简历写好了吗?简历怎...
简历制作不要暴露你的求职动机 简历制作不要暴露你的求职动机  或是抱着学习的目的,或是为了优厚待遇,或是冲着企业名声,以上这些,无...
投简历邮件正文怎么写   现在很多用人单位都会要求求职者通过邮件投递简历的,那么,投简历邮件正文怎么写?下面就由小编给大家...
个人简历中技能特长怎么写 个人简历中技能特长怎么写  技能特长属于具体性描述,它需要全面、详细、有重点地将自身的技能、特长等核...
应届毕业生简历模板word格... 每一届大四学生都必须经历实习之旅才能正式毕业,只是,即将踏入社会的大四学生总纠结于实习简历表格要怎么...