Nginx Rewrite重写
Posted 我的紫霞辣辣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx Rewrite重写相关的知识,希望对你有一定的参考价值。
Rewrite基本概述
什么是Rewrite
- Rewrite主要实现url地址重写,以及重定向,就是把传入Web的请求重定向到其他URL的过程。
Rewrite使用场景
- 地址跳转,用户访问www.nana.com这个URL时,将其定向至一个新的域名 dada.nana.com。
- 协议跳转,用户通过http协议请求网站时,将其重新跳转至https协议方式。
- 伪静态,将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时减少动态URL地址对外暴露过多的参数,提升更高的安全性。
- 搜索引擎,SEO优化依赖于URL路径,好记的URL便于支持搜索引擎录入。
Rewrite配置示例
rewrite regex replacement [flag];
Default: --
Context: server,location,if
# 用于切换维护页面的场景
rewrite ^(.*)$ /page/maintain.html break
Rewrite标记Flag
rewrite指令根据表达式来重定向url
,或者修改字符串。可以应用于server,location,if
环境下,每行rewrite
指令最后跟一个flag
标记,支持flag
标记如下所示:
last 本条规则匹配完成后,停止匹配,不再匹配后面的规则 # 开发用的比较多
break 本条规则匹配完成后,停止匹配,不再匹配后面的规则 # 开发用的比较多
redirect 返回302临时重定向,地址栏会显示跳转后的地址
permanent 返回301永久重定向,地址栏会显示跳转后的地址
last与break的区别
- lb01服务器
1. 修改nginx配置文件
vim /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name rewrite.nana.com;
root /code;
location ~ ^/break {
rewrite ^/break /test/ break;
# 如果输入的是rewrite.nana.com/break,那么就跳转到rewrite.nana.com/test下。break标记
}
location ~ ^/last {
rewrite ^/last /test/ last;
# 如果输入的是rewrite.nana.com/last,那么就跳转到rewrite.nana.com/test下。last标记
}
location /test/ {
default_type application/json;
# 定义字符串类型,参照/etc/nginx/mime.types文件
return 200 "ok";
}
}
2. 重启Nginx服务
systemctl restart nginx
3. 在本机添加域名解析
C:\\Windows\\System32\\drivers\\etc
在hosts文件添加域名解析
192.168.15.5 rewrite.nana.com
- 测试
我们在浏览器中输入rewrite.nana.com/last,可以正常访问到ok。
输入rewrite.nana.com/break,页面返回404错误。
break规则匹配
- 请求
rewrite.nana.com/break
首先 : 会去查找本地的/code/test/index.html
(默认静态文件)的内容;
如果没有找到该目录则报错404,如果找到了该目录但是没有找到对应的文件则报错403。
last规则匹配
- 请求
rewrite.nana.com/last
首先 : 会对当前server层重新的发起一次请求
,rewrite.nana.com/test/
。
如果有location规则匹配上,则直接返回该location的内容;
如果没有location规则匹配上,会再去查找本地的/code/test/index.html
(默认静态文件)的内容;
如果没有找到该目录则报错404,如果找到了该目录但是没有找到对应的文件则报错403。
redirect与permanent区别
- lb01服务器
rm -rf /etc/nginx/conf.d/rewrite.conf
# 删除上一个配置文件,否则nginx监听的端口会发生冲突
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/rewrite01.conf
server {
listen 80;
server_name rewrite.nana.com;
root /code;
location /dada {
rewrite ^(.*)$ http://www.4399.com redirect;
#rewrite ^(.*)$ http://www.4399.com permanent;
}
}
2. 重启Nginx服务
systemctl restart nginx
- 测试
打开浏览器,输入rewrite.nana.com/dada,会自动跳转到4399小游戏主界面。
关闭Nginx服务(systemctl stop nginx),我们会发现输入rewrite.nana.com/dada,页面显示404。
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/rewrite01.conf
server {
listen 80;
server_name rewrite.nana.com;
root /code;
location /dada {
# rewrite ^(.*)$ http://www.4399.com redirect;
rewrite ^(.*)$ http://www.4399.com permanent;
}
}
2. 重启Nginx服务
systemctl restart nginx
- 测试
打开浏览器,输入rewrite.nana.com/dada,会自动跳转到4399小游戏主界面。
关闭Nginx服务(systemctl stop nginx),我们会发现输入rewrite.nana.com/dada,依然可以跳转到4399小游戏主界面。
redirect匹配规则(302)
- 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。
permanent匹配规则(301)
- 每一次请求会询问,浏览器都会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。
Nginx地址跳转场景实践
场景一
实验要求
http://rewrite.nana.com/abc/index.html ===> http://rewrite.nana.com/ccc/bbb/index.html
实验环境
- lb01服务器
rm -rf /etc/nginx/conf.d/rewrite01.conf
# 删除上一个配置文件,否则nginx监听的端口会发生冲突
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/rewrite02.conf
server {
listen 80;
server_name rewrite.nana.com;
root /code;
location / {
index index.html;
}
}
2. 创建Nginx配置文件指定的文件
mkdir -p /code/ccc/bbb
echo "66666..." > /code/ccc/bbb/index.html
3. 重启Nginx服务
systemctl restart nginx
- 测试
我们在浏览器输入rewrite.nana.com/ccc/bbb,访问页面显示66666...
实现跳转
1. 修改配置文件
vim /etc/nginx/conf.d/rewrite02.conf
server {
listen 80;
server_name rewrite.nana.com;
root /code;
location / {
index index.html;
}
location /abc {
rewrite ^(.*)$ /ccc/bbb/index.html redirect;
}
}
2. 重启Nginx服务
systemctl restart nginx
- 测试
我们在浏览器输入rewrite.nana.com/abc,页面会跳转到rewrite.nana.com/ccc/bbb/index.html,访问页面显示66666...
场景二
实验要求
http://rewrite.nana.com/2018/ccc/bbb/1.html ===> http://rewrite.nana.com/2014/ccc/bbb/1.html
http://rewrite.nana.com/2018/ccc/bbb/2.html ===> http://rewrite.nana.com/2014/ccc/bbb/2.html
- 只将url地址的目录2018替换成2014,其他的均不改动
实验环境
- lb01服务器
rm -rf /etc/nginx/conf.d/rewrite02.conf
# 删除上一个配置文件,否则nginx监听的端口会发生冲突
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/rewrite03.conf
server {
listen 80;
server_name rewrite.nana.com;
root /code;
location / {
index index.html;
}
}
2. 创建Nginx配置文件指定的文件
mkdir -p /code/2014/ccc/bbb
echo "html01" > /code/2014/ccc/bbb/1.html
echo "html02" > /code/2014/ccc/bbb/2.html
3. 重启Nginx服务
nginx -t
systemctl restart nginx
- 测试
我们在浏览器输入rewrite.nana.com/2014/ccc/bbb/1.html可以正常访问到html01
输入rewrite.nana.com/2014/ccc/bbb/2.html可以正常访问到html02
实验跳转
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/rewrite03.conf
server {
listen 80;
server_name rewrite.nana.com;
root /code;
location / {
index index.html;
}
location ~ /2018 {
rewrite ^/2018/(.*)$ /2014/$1 redirect;
# url地址路径2018直接跳转至2014,其他数据路径不变
}
}
2. 重启Nginx服务
nginx -t
systemctl restart nginx
- 测试
我们在浏览器输入rewrite.nana.com/2018/ccc/bbb/1.html跳转至rewrite.nana.com/2014/ccc/bbb/1.html
输入rewrite.nana.com/2018/ccc/bbb/2.html跳转至rewrite.nana.com/2014/ccc/bbb/2.html
场景三
http://rewrite.nana.com/course-11-22-33.html ===> http://rewrite.nana.com/course/11/22/33/course_33.html
http://rewrite.nana.com/course-44-55-66.html ===> http://rewrite.nana.com/course/44/55/66/course_66.html
实验环境
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/rewrite03.conf
server {
listen 80;
server_name rewrite.nana.com;
root /code;
location / {
index index.html;
}
}
2. 创建Nginx配置文件指定的数据
mkdir -p /code/course/11/22/33
mkdir -p /code/course/44/55/66
echo "11 22 33" > /code/course/11/22/33/course_33.html
echo "44 55 66" > /code/course/44/55/66/course_66.html
2. 重启Nginx服务
nginx -t
systemctl restart nginx
- 测试
我们在浏览器输入rewrite.nana.com/course/11/22/33/course_33.html,访问浏览器页面显示11 22 33
输入rewrite.nana.com/course/44/55/66/course_66.html跳转至44 55 66
实验跳转
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/rewrite03.conf
server {
listen 80;
server_name rewrite.nana.com;
root /code;
location / {
index index.html;
}
location ~ ^/course {
rewrite (.*)-(.*)-(.*)-(.*)\\.(.*) /$1/$2/$3/$4/$1_$4.$5 redirect;
# 通过正则表达式进行匹配
}
}
2. 重启Nginx服务
nginx -t
systemctl restart nginx
- 测试
我们在浏览器输入rewrite.nana.com/course-11-22-33.html跳转至rewrite.nana.com/course/11/22/33/course_33.htm
输入rewrite.nana.com/course-44-55-66.html跳转至rewrite.nana.com/course/44/55/66/course_66.html
Rewrite日志功能
我们对Rewrite进行调试,需要开启Rewrite日志
- 设置nginx.conf配置文件中的错误日志级别为notice(nginx中最低级别的错误),并开启rewrite日志。
1. 修改主配置文件
vim /etc/nginx/nginx.conf
error_log /var/log/nginx/error.log notice;
http {
...
rewrite_log on; # 记录rewrite_log错误日志
}
2. 重启nginx服务
nginx -t
systemctl restart nginx
Nginx协议跳转
- Nginx协议跳转
vim /etc/nginx/conf.d/rewrite02.conf
server {
listen 80;
server_name rewrite.nana.com;
# rewrite ^(.*) https://$server_name$1 redirect
return 302 https://$server_name$request_uri;
# request_uri标识了域名后面的路径
}
server {
listen 443;
server_name rewrite.nana.com;
ssl on;
}
rewrite与return
rewrite url替换 格式:rewrite 正则 真实的文件 flag
return http-->https 格式:return 状态码 跳转后的地址(可以使用变量)
状态码: 301 permanent
302 redirect
以上是关于Nginx Rewrite重写的主要内容,如果未能解决你的问题,请参考以下文章