一.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