简介
什么是rewrite?
rewrite即URL重写,主要实现URL地址重写,以及重定向。
就是把插入web的请求重定向到其他URL的过程。
rewrite使用场景
- URL地址调整
例如用户访问wang.mingqu.com将其跳转到ming.mingqu.com。
或者当用户通过http的方式访问wang.mingqu.com时,将其跳转至https的方式访问ming.mingqu.com
- URL伪静态
将动态页面显示未静态页面方式的一种技术。
便于搜索引擎的录入,同时减少动态URL地址对我暴漏过多参数,提升更高的安全性。
- 搜索引擎SEO优化依赖于URL路径,以便于搜索引擎录入。
- 可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
rewrite基本语法
语法格式
rewrite regex replacement [flag];
rewrite 正则表达式 替换内容 标记;
适用范围
server,针对某个网站的重定向。
location,针对某个页面的重定向。
if,或者使用if语句判断是否重定向。
表达式元字符
字符 | 说明 |
---|---|
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次 |
+ | 匹配前面的字符一次或多次 |
? | 匹配前面的字符零次或一次 |
. | 匹配除"\n"之外的任何单个字符 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用字符 |
\d | 匹配纯数字 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
[c] | 匹配单个字符c |
[a-z] | 匹配a到z的小写字母的任意一个 |
[a-zA-Z] | 匹配a到z的小写字母或A到Z的大写字母的任意一个 |
() | 表达式的开始和结束位置 |
| | 或运算符 |
标记说明
标记 | 说明 | 特点 |
---|---|---|
last | 相当于apache的[L]标记,表示完成rewrite | 在本条规则完成后,继续向下匹配新的location URL规则,一般或者用在server和if当中。 |
break | 本条规则匹配完成即终止,不在匹配后面的任何规则 | break在location下面用的多,与last类似,但是不会重新发起一次处理过程,而是直接放回处理结果 |
redirect | 返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url | 该标记表示当前规则匹配成功后会立即进行重定向操作 |
permanent | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url | 该标记和redirect类似,他是永久重定向 |
rewrite匹配优先级
- 先执行server标签中的rewrite指令。
- 再执行location标签的匹配。
- 最后执行location标签中的rewrite指令。
场景变量
举例:https://blog.csdn.net/weixin_40901913/article/details/135625896
- $host:表示匹配域名,如:blog.csdn.net。
- $server_port:表示匹配端口,默认http端口80,默认https端口443。
- $request_uri:表示匹配完整的请求URL,如:https://blog.csdn.net/weixin_40901913/article/details/135625896。
- $document_uri:表示匹配完整的请求路径,如:/weixin_40901913/article/details/135625896。
- $document_root:表示匹配真实的站点目录,如:/www/wangmingqu/html/。
- $request_filename:表示匹配真实站点目录下的文件,如:/www/wangmingqu/html/test.png
location基本语法
location分类
符号 | 举例 | 解释 |
---|---|---|
= | location = test {} | 精确匹配 |
location test {} | 一般匹配 | |
~ | location ~ test {} | 正则匹配 |
location正则表达式
标记 | 说明 |
---|---|
~ | 执行一个正则匹配,区分大小写 |
~* | 执行一个正则匹配,不区分大小写 |
!~ | 执行一个正则匹配,区分大小写不匹配 |
!~* | 执行一个正则匹配,不区分大小写不匹配 |
^~ | 普通字符匹配,使用前缀匹配,如果匹配成功,则不再匹配其他的location |
= | 普通字符精确匹配,也就是完全匹配 |
@ | 定义一个命令的location,使用在内部定向时 |
location优先级
- 首先是精确匹配。
- 其次是前缀匹配。
- 再次是按文件中顺序的正则匹配。
- 然后是匹配不带任何修饰的前缀匹配。
- 最后是通用匹配。
- 总结:
(1)优先级总结:(location=完整路径)>(location ^~ 路径)>(location~,~*正则顺序)>(location不分起始路径)>(location /)
(2)location匹配:
首先看优先级:精确(=)>前缀(^~)>正则(~,~*)>一般>通用(/)
优先级相同:正则看上下顺序,上面的优先,一般匹配看长度,最长匹配的优先精确,前缀,正则,一般都没有匹配到,最后再看通用匹配,一般匹配
应用
准备环境
安装Nginx
默认已安装了Nginx,此处使用yam安装(与源码安装同理)。
配置Nginx
- 主配置文件修改,路径:/etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
#开启重写日志
rewrite_log on;
include /etc/nginx/conf.d/*.conf;
}
- 子配置文件修改,路径:/etc/nginx/conf.d/wangmingqu.conf
server {
listen 80;
server_name wang.mingqu.com;
charset utf8;
location / {
root /www/wangmingqu/html;
index index.html index.htm;
}
location /weihu {
root /www/wangmingqu;
index index.html index.htm;
}
}
资源准备
- 测试页面准备
mkdir -p /www/wangmingqu/{html,weihu,student/video}
echo "重写测试页面 192.168.108.129" > /www/wangmingqu/html/index.html
echo "重写测试页面 维护页面" > /www/wangmingqu/weihu/index.html
echo "访问文件路径为:/www/wangmingqu/student/video/" > /www/wangmingqu/student/video/index.html
- 测试页面预览
案例一
目标
基于域名的跳转。
访问域名:wang.mingqu.com/baidu时,跳转至域名:www.baidu.com。
操作
- 编辑Nginx配置文件
server {
listen 80;
server_name wang.mingqu.com;
charset utf8;
location / {
root /www/wangmingqu/html;
index index.html index.htm;
}
location /baidu {
rewrite ^/baidu https://www.baidu.com;
}
}
- 检查配置
nginx -t
systemctl reload nginx
验证
- 访问验证
- 日志查看
tail -300f /var/log/nginx/error.log
2024/02/01 10:53:21 [notice] 27663#27663: *84 "/baidu" matches "/baidu", client: 192.168.108.1, server: wang.mingqu.com, request: "GET /baidu HTTP/1.1", host: "wang.mingqu.com"
2024/02/01 10:53:21 [notice] 27663#27663: *84 rewritten redirect: "https://www.baidu.com", client: 192.168.108.1, server: wang.mingqu.com, request: "GET /baidu HTTP/1.1", host: "wang.mingqu.com"
案例二
目标
基于客户端IP访问跳转。
所有IP访问网站均为一个固定页面,仅客户端(192.168.108.1)可以正常访问。
操作
- 编辑Nginx配置文件
server {
listen 80;
server_name wang.mingqu.com;
charset utf8;
#设置一个变量,名称为rewrite_IP,变量值为true。
set $rewrite true;
#判断是否为合法IP
if ($remote_addr = "192.168.108.1"){
#如果地址不是192.168.108.1,则将rewrite_IP变量值设为false。
set $rewrite false;
}
#除了合法IP,其他IP都进行重写跳转维护页面
if ($rewrite = true){
rewrite (.+) /weihu.html;
}
location = /weihu.html {
root /www/wangmingqu/weihu/;
index index.html index.htm;
}
location / {
root /www/wangmingqu/html;
index index.html index.htm;
}
}
- 检查配置
nginx -t
systemctl reload nginx
验证
- 访问验证
192.168.108.1主机访问
192.168.108.130主机访问
- 查看日志
案例三
目标
基于旧域名跳转到新域名,后面加路径
现在访问http://www.wangmingqu.com/video,将直接跳转到http://wang.mingqu.com/student/video
操作
- 编辑Nginx配置文件
server {
listen 80;
server_name www.wangmingqu.com;
charset utf-8;
location /video {
#这里的$1为位置变量,代表/video
rewrite (.+) http://wang.mingqu.com/student/$1 permanent;
}
location / {
root /www/wangmingqu/student/video;
index index.html index.htm;
}
}
- 检查配置
nginx -t
systemctl reload nginx
验证
- 访问验证
- 查看日志
案例四
目标
基于参数匹配的跳转
现在访问http://wang.mingqu.com/10010.html,跳转到http://wang.mingqu.com页面。
操作
- 编辑Nginx配置文件
server {
listen 80;
server_name wang.mingqu.com;
charset utf-8;
if ($request_uri ~ ^/10010.html$) {
rewrite (.+) http://wang.mingqu.com permanent;
}
location / {
root /www/wangmingqu/html;
index index.html index.htm;
}
}
- 检查配置
nginx -t
systemctl reload nginx
验证
- 访问验证
- 查看日志
案例五
目标
基于目录下所有php结尾的文件跳转
当访问http://wang.mingqu.com/data/121.php跳转到http://wang.mingqu.com。
操作
- 编辑Nginx配置文件
server {
listen 80;
server_name wang.mingqu.com;
charset utf-8;
location ~* /data/.*\.php$ {
rewrite (.+) http://wang.mingqu.com permanent;
}
location / {
root /www/wangmingqu/html;
index index.html index.htm;
}
}
- 检查配置
nginx -t
systemctl reload nginx
验证
- 访问验证
- 查看日志
案例六
目标
基于普通的url请求跳转
当访问http://wang.mingqu.com/data/121.html跳转到http://wang.mingqu.com
操作
- 编辑Nginx配置文件
server {
listen 80;
server_name wang.mingqu.com
charset utf-8;
location ~* ^/data/121.html {
rewrite (.+) http://wang.mingqu.com permanent;
}
if ($request_uri ~* ^/abc/abc.html$) {
rewrite (.+) http://wang.mingqu.com permanent;
}
location / {
root /www/wangmingqu/html;
index index.html index.htm;
}
}
- 检查配置
nginx -t
systemctl reload nginx
验证
- 访问验证
- 查看日志