Nginx Rewrite重写

Posted 我的紫霞辣辣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx Rewrite重写相关的知识,希望对你有一定的参考价值。

Rewrite基本概述

什么是Rewrite

  • Rewrite主要实现url地址重写,以及重定向,就是把传入Web的请求重定向到其他URL的过程。

Rewrite使用场景

  1. 地址跳转,用户访问www.nana.com这个URL时,将其定向至一个新的域名 dada.nana.com。
  2. 协议跳转,用户通过http协议请求网站时,将其重新跳转至https协议方式。
  3. 伪静态,将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时减少动态URL地址对外暴露过多的参数,提升更高的安全性。
  4. 搜索引擎,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重写的主要内容,如果未能解决你的问题,请参考以下文章

第十八章 Nginx Rewrite重写

Nginx Rewrite重写

Nginx Rewrite重写

Nginx URL重写(rewrite)配置及信息详解

Nginx URL重写(rewrite)配置及信息详解

nginx rewrite url重写, if,负载均衡 ,nginx反向代理配置