Nginx的rewrite地址重写
Posted 礁之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx的rewrite地址重写相关的知识,希望对你有一定的参考价值。
文章目录
一、Rewrite基本概述
-
Rewrite的作用:主要实现URL地址重写,以及地址重定向
-
Rewrite的使用场景:
- URL访问跳转:支持开发设计,页面跳转,兼容性支持,展示效果
- SEO优化:依赖于URL路径,以便于支持搜索引擎录入
- 维护:后台维护,流量转发等
- 安全:伪静态
- Rewrite配置语法:
语法: rewrite regex replacement [flag];
可配置区域: server、location、if
例如:把所有请求都转发给/aaa/bbb.html
rewrite ^(.*)$ /aaa/bbb.html break;
二、Rewrite标记,Flag
(1)flag类型
Flag | 意义 |
---|---|
last | 如果跳转的资源没有,那么就往下面的location需找资源,如果有就跳转,没有就停止跳转 |
break | 如果跳转的资源没有,那么会直接停止跳转 |
redirect | 返回302临时重定向,地址栏会显示跳转后的地址,只会在nginx开启的时候生效 |
permanent | 返回301永久重定向,地址栏会显示跳转后的地址,Nginx关闭后也会生效 |
(2)对于Flag中的break和last
-实验环境
系统 | 主机名 | ip地址 | nginx版本 |
---|---|---|---|
Cetnos7.4 | rzy | 192.168.100.202 | Nginx-1.18.0 |
-实验步骤
******(1)先做基础配置
[root@Centos7 ~]# hostnamectl set-hostname rzy
[root@Centos7 ~]# su
[root@rzy ~]# systemctl stop firewalld
[root@rzy ~]# setenforce 0
setenforce: SELinux is disabled
[root@rzy ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
/dev/sr0 已经挂载到 /mnt 上
******(2)上传Nginx源码包,进行安装
[root@rzy ~]# yum -y install zlib-devel pcre-devel
。。。。。。
完毕!
[root@rzy ~]# ll
总用量 1020
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 1039530 4月 19 10:03 nginx-1.18.0.tar.gz
[root@rzy ~]# tar xf nginx-1.18.0.tar.gz -C /usr/src/
[root@rzy ~]# cd /usr/src/nginx-1.18.0/
[root@rzy nginx-1.18.0]# useradd -M -s /sbin/nologin nginx
[root@rzy nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
[root@rzy nginx-1.18.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@rzy nginx-1.18.0]# vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@rzy nginx-1.18.0]# cd /usr/local/nginx/conf/
[root@rzy conf]# cp nginx.conf nginx.conf.bak
[root@rzy conf]# sed -i '/#/d' nginx.conf
[root@rzy conf]# sed -i '/^$/d' nginx.conf
******(3)修改配置文件
[root@rzy conf]# vim nginx.conf
1 worker_processes 1;
2 events {
3 worker_connections 1024;
4 }
5 http {
6 include mime.types;
7 default_type application/octet-stream;
8 sendfile on;
9 keepalive_timeout 65;
10 server {
11 listen 80;
12 server_name localhost;
13 root /aaa/bbb; #网页目录
14 location ~ ^/break { #匹配break资源
15 rewrite ^/break /ccc/ break; #跳转到/ccc/
16 }
17 location ~ ^/last { #匹配last资源
18 rewrite ^/last /ccc/ last; #跳转到/ccc/
19 }
20 location ~ /ccc/ { #匹配/ccc/资源
21 default_type application/json;
22 return 200 '{"status":"success"}'; #返回200状态码,内容是{"status":"success"}的页面
23 }
24
25 }
26 }
[root@rzy conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@rzy conf]# systemctl start nginx
使用浏览器进行访问
分别访问这三个location,发现break直接报错,而last和/ccc/可以访问成功,这就是因为在指定的网页目录找不到指定资源的情况下,break会直接停止跳转从而报错404找不到页面,而last会继续往下寻找跳转的资源,所以last可以访问成功
(2)对比Flag中的redirect和permanent
-实验环境
系统 | 主机名 | ip地址 | nginx版本 |
---|---|---|---|
Cetnos7.4 | rzy | 192.168.100.202 | Nginx-1.18.0 |
两个类型都可以进行跳转,都是last的检测方式,即找不到资源就往下一个location寻找
-实验步骤
******(1)继续上面的实验,修改配置文件
[root@rzy ~]# vim /usr/local/nginx/conf/nginx.conf
1 worker_processes 1;
2 events {
3 worker_connections 1024;
4 }
5 http {
6 include mime.types;
7 default_type application/octet-stream;
8 sendfile on;
9 keepalive_timeout 65;
10 server {
11 listen 80;
12 server_name localhost;
13 root /aaa/bbb;
14 location ~ ^/aaa {
15 rewrite ^/aaa /ccc/ redirect;
16 }
17 location ~ ^/bbb{
18 rewrite ^/bbb /ccc/ permanent;
19 }
20 location ~ /ccc/ {
21 default_type application/json;
22 return 200 '{"status":"success"}';
23 }
24
25 }
26 }
[root@rzy ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@rzy ~]# systemctl restart nginx
在Nginx开启的时候,两种类型都可以进行重定向
关闭Nginx,再次进行访问
访问aaa无法跳转,访问bbb可以跳转到ccc
以上是关于Nginx的rewrite地址重写的主要内容,如果未能解决你的问题,请参考以下文章