Nginx跳转模块之rewrite

本文详细解释了Nginx中的location与rewrite模块的区别,包括rewrite模块的功能、跳转场景、实现方式、执行顺序以及重写规则的格式。并通过实际案例展示了基于域名、客户端IP和旧域名重定向到新域名的配置过程。

目录

一.location与rewrite模块的区别

二.rewrite模块基本内容

1.功能

2.跳转场景

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

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

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

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

3.跳转实现

(1)Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else

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

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

(4)重写模块 set 指令:创建新的变量并设其值

4.执行顺序

5.格式

(1)last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中。

(2)break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中。

(3)redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。

(4)permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

三.rewrite实验

1.基于域名跳转

(1)修改主配置文件

(2)创建所需目录与文件

(3)添加域名与IP地址映射关系

(4)网页验证

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

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

(1)修改主配置文件

(2)设置维护界面并重启服务

(3)网页验证

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

(1)修改主配置文件

(2)检查语法重启服务

(3)网页验证

(4)浏览器验证


一.location与rewrite模块的区别

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

二.rewrite模块基本内容

1.功能

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理

2.跳转场景

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

(1)可以调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求
(2)为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态 URL 地址伪装成静态地址提供服务
(3)网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com会跳转到 jd.com
(4)根据特殊变量、目录、客户端的信息进行 URL 调整等。

3.跳转实现

(1)Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
(2)跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
(3)从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
(4)重写模块 set 指令:创建新的变量并设其值

4.执行顺序

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

5.格式

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

flag标记说明

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

三.rewrite实验

1.基于域名跳转

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

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

(2)创建所需目录与文件
#创建日志文件夹,检查语法
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
------------------------------------------
<h1 font color=red>
Here is the content of test
<img src="1.jpg"/>
</h1
-------------------------------------------
 
#上传1.jpg图片文件
cd /usr/local/nginx/html/test
rz -E

(3)添加域名与IP地址映射关系
#添加映射关系
echo "192.168.227.100 www.6.com www.9.com" >> /etc/hosts
 
#重启服务
systemctl restart nginx					

(4)网页验证
#打开浏览器输入
www.6.com/test/1.html
 
 
会发现重定向到www.9.com/test/1.html

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

公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.227.100访问正常。
(1)修改主配置文件
vim /usr/local/nginx/conf/nginx.conf
--------------------------------------------------------------
server {
	listen       80;
	server_name  www.6.com;												#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kgc.com-access.log;				#日志修改
 
	#设置是否合法的IP标记
    set $rewrite true;							#设置变量$rewrite,变量值为boole值true
    #判断是否为合法IP
	if ($remote_addr = "192.168.227.100"){		#当客户端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;
    }
}

(2)设置维护界面并重启服务
mkdir -p /var/www/html/
vim /var/www/html/weihu.html
-----------------------------------
<h1>
Sorry!
We are busy now!
See you tomorrow!
</h1>
-----------------------------------
 
systemctl restart nginx

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

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

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

(1)修改主配置文件
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;
    }
}
(2)检查语法重启服务
vim /etc/hosts
--------------
192.168.227.100 www.6.com mail.6.com
(3)网页验证
mkdir -p /usr/local/nginx/html/mail/post
vim /usr/local/nginx/html/mail/post/1.html
-------------------------------------------
<h1>
hi
</h1>
---------------------------------------------
nginx -t
systemctl restart nginx
(4)浏览器验证
输入mail.6.com/post/1.html
显示为www.6.com/mail/post/1.html
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值