网站架构部署与优化--NginxRewrite(Rewrite概述、Nginx 的正则表达式 、Rewrite 的语法 、 Rewrite应用实操)

news/2024/5/13 23:03:18/文章来源:https://blog.csdn.net/kimowinter/article/details/107952829

文章目录

  • 一、 NginxRewrite 概述
    • 1.1 Rewrite 跳转场景
    • 1.2 Rewrite 跳转实现
    • 1.3 Rewrite 实际应用场景
  • 二、 Nginx 的正则表达式
    • 三、 Rewrite 语法
    • 3.1 flag 标记说明:
    • 3.2 Location 分类
    • 3.3 Location 优先级
      • 相同类型的表达式,字符串长的会优先匹配
      • rewrite 也会写在 location
      • 如果是匹配某个具体文件:
      • 如果是用目录做匹配访问某个文件:
  • 四、 Rewrite应用
    • 实验中注意细节点
    • 4.1 基于域名的跳转
    • 4.2 基于客户端IP跳转
    • 4.3 基于旧域名跳转到新域名后面加目录
    • 4.4 基于参数匹配的跳转
    • 4.5 基于目录下所有 php 结尾的文件跳转
    • 4.6 基于最普通一条 url 请求的跳转

一、 NginxRewrite 概述

现在 Nginx 已经成为很多公司作为前端反向代理服务器的首选,在实际工作中往往会 遇到很多跳转(重写 URL)的需求。比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。 和Apache相比Nginx 跳转效率会更高。

1.1 Rewrite 跳转场景

Rewrite 跳转场景主要包括以下几种:

  • 可以调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求。
  • 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态 URL 地址伪装成静态地
    址提供服务。
  • 网址换新域名后,让旧的访问跳转到新的域名上。
  • 根据特殊变量、目录、客户端的信息进行 URL 调整等。

1.2 Rewrite 跳转实现

  1. Nginx 是通过 ngx_http_rewrite_module 模块支持 url 重写、支持 if 条件判断,但不支持else。该模块需要 PCRE 支持,再编译时候就安装。

  2. 从一个 location 跳转到另一个 location,不过这样 的循环最多可以执行 10 次,超过后 Nginx 将返回 500 错误。

  3. 重写模块包含 set 指令,来创建新的变量并设其值。

rewrite功能就是使用 Nginx 提供的全局变量或自己设置的变量,结合正则表达式和标志位实现 url 重写以及重定向。

1.3 Rewrite 实际应用场景

Nginx 跳转需求有三种方式可实现

  1. 直接用 rewrite 进行匹 配跳转
  2. 使用 if 匹配全局变量后跳转。
  3. 使用 location 匹配再跳转。

二、 Nginx 的正则表达式

常用的正则表达式元字符
字符描述
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次.如“sx*”能匹配“s”及“sx”、“sxx”
+匹配前面的字符一次或多次。如“sx+”能匹配“sx”及“sxx”,但不能匹配“s”
?匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
.匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]” 之类的模式
\将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一 个换行符,而“$”则匹配“$”
\d匹配纯数字
{n}重复 n 次
{n,}重复 n 次或更多次
[c]匹配单个字符 c
[a-z]匹配 a-z小写字母的任意一个
[a-zA-Z]匹配 a-z小写字母或 A-Z 大写字母的任意一个

三、 Rewrite 语法

rewrite<regex><replacement>[flag];regex 表示正则匹配规则replacement 表示跳转后的内容flag 表示rewrite支持的flag标记。

3.1 flag 标记说明:

  • last:相当于 Apache 的[L]标记,表示完成 rewrite
  • break:本条规则匹配完成即终止,不再匹配后面的任何规则
  • redirect:返回302临时重定向,浏览器地址会显示跳转后的 URL 地址,爬虫不会更新 url(因为是临时)
  • permanent:返回301永久重定向,浏览器地址栏会显示跳转后的 URL 地址,爬虫更新url。
  • 如果后面不跟 flag 标记,那么默认是 302 临时重定向。

在实际工作场景中,还有另一 种 return 指定。因为301和302不能简单的只返回状态码,还必须有重定向的 URL,这就是return指令无法返回 301 和 302 的原因。

  • last 和 break 区别

last 一般写在server和if中,而break一般使用在 location 中。 last 不终止重写后的 url 匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配。

3.2 Location 分类

location = patt {} [精准匹配]
location patt {} [一般匹配]
location ~ patt {} [正则匹配]
  • ~ 表示执行一个正则匹配,区分大小写。
  • ~ * 表示执行一个正则匹配,不区分大小写。
  • !~ 表示执行一个正则匹配,区分大小写不匹配。
  • !~* 表示执行一个正则匹配,不区分大小写不匹配。
  • ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他 location。
  • = 进行普通字符精确匹配,也就是完全匹配。
  • @ 它定义一个命名的 location,使用在内部定向时,例如 error_page,try_files。

3.3 Location 优先级

相同类型的表达式,字符串长的会优先匹配

  • 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
  • ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
  • 正则表达式类型(~ 和~*)的优先级次之。
  • 常规字符串匹配类型。按前缀匹配。
  • 通用匹配(/),如果没有其它匹配,任何请求都会匹配到。

rewrite 也会写在 location

  1. 执行 server 块里面的 rewrite 指令。
  2. 执行 location 匹配。
  3. 执行选定的 location 中的 rewrite 指令

如果是匹配某个具体文件:

(location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径) > (location 完整路径) > (location /)

如果是用目录做匹配访问某个文件:

(location = 目录) > (location ^~ 目录/) > (location ~ 目录) > (location ~* 目录) > (location 目录) > (location /)

四、 Rewrite应用

实验中注意细节点

      每次做完一个实验后,要记得清空浏览器的缓存注意配置文件中的空格,多或者少会导致实验不成功

4.1 基于域名的跳转

  • 实验需求:
    公司的旧域名 www.njit.com 有业务需求变更 , 需要使用新域名www.newnjit.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
[root@localhost ~]# iptables -F   ##清空防火墙规则
[root@localhost ~]# setenforce 0   ##临时关闭内核防护
[root@localhost ~]#  rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm    ##安装nginx-release  yum源
[root@localhost ~]# yum install nginx -y   ##安装nginx
[root@localhost ~]# rpm -qc nginx

在这里插入图片描述

[root@localhost ~]# vim /etc/nginx/conf.d/default.conf 
server_name  www.njit.com;
access_log  /var/log/nginx/host.access.log  main;
在图片中的位置写入以下语句
if ($host = 'www.njit.com') {rewrite ^/(.*)$ http://www.newnjit.com/$1 permanent;}
[root@localhost ~]# systemctl start nginx

在这里插入图片描述
在这里插入图片描述
接下来进行配置DNS域名解析

[root@localhost ~]# yum install bind -y
[root@localhost ~]# vim /etc/named.conf

在这里插入图片描述

[root@localhost ~]# vim /etc/named.rfc1912.zones

在这里插入图片描述

[root@localhost ~]# cp -p /var/named/named.localhost /var/named/njit.com.zone
[root@localhost ~]# vim /var/named/njit.com.zone

在这里插入图片描述

[root@localhost ~]# cp -p /var/named/njit.com.zone /var/named/newnjit.com.zone 
[root@localhost ~]# systemctl start named

在win10虚拟机中进行访问,win10虚拟机的DNS要设置为14.0.0.27
在这里插入图片描述
在这里插入图片描述

4.2 基于客户端IP跳转

我的实验是在上一个实验的环境下进行,需要先将上一个实验的内容删掉再进行,以防出错。

  • 实验需求:
    公司业务版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只 有公司 IP 访问正常
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf #判断标志$rewriteset $rewrite true;#允许公司内部访问,更改标志位falseif ($remote_addr = "14.0.0.10"){set $rewrite false;}#如果不是公司的IP,加上后缀地址作为标识if ($rewrite = true) {rewrite (.+) /error.html;}
[root@localhost ~]# vim /usr/share/nginx/html/error.html
<h1>this is a error web</h1>
[root@localhost ~]# systemctl restart nginx

在这里插入图片描述

在这里插入图片描述

在win10虚拟机中进行访问
首先将win10虚拟机的IP地址设置为非14.0.0.10
在这里插入图片描述

在这里插入图片描述
然后将win10虚拟机的IP地址设置为14.0.0.10,这个IP地址在nginx的配置文件中是被允许访问的。
在这里插入图片描述

在这里插入图片描述

4.3 基于旧域名跳转到新域名后面加目录

  • 实验需求:
    现在访问的是 http://mail.njit.com,现在需要将这个域名下面的发帖都跳转到 http://www.njit.com/mail,注意保持域名跳转后的参数不变。
修改nginx配置文件
[root@localhost ~]# vim /etc/nginx/conf.d/default.conflocation /post {rewrite (.+) http://www.njit.com/mail$1 permanent;}
[root@localhost ~]# systemctl restart nginx
修改DNS区域数据配置文件
[root@localhost ~]# vim /var/named/njit.com.zone 
mail IN A       14.0.0.27
[root@localhost ~]# systemctl restart named

在这里插入图片描述

在另外一台centos7中,写入域名服务器解析地址IP,用centos7自带的浏览器进行测试
[root@nginx ~]# echo "nameserver=14.0.0.27" > /etc/resolv.conf

在这里插入图片描述
在这里插入图片描述

4.4 基于参数匹配的跳转

  • 实验需求:
    访问http://www.njit.com/100-100-100.html或者http://www.njit.com/100-200-100.html,跳转到http://www.njit.com 页面,这里以http://www.njit.com/100-100-100.html为例。
[root@localhost ~]# vim /etc/nginx/conf.d/default.confif ($request_uri ~ ^/100-(100|200)-(\d+).html$){rewrite (.*) http://www.njit.com permanent;}
[root@localhost ~]# systemctl restart nginx

在这里插入图片描述
将上次实验的mail改为www

[root@localhost ~]# vim /var/named/njit.com.zone 
[root@localhost ~]# systemctl restart named

在这里插入图片描述

在win10虚拟机中进行测试,这里以
在这里插入图片描述

在这里插入图片描述

4.5 基于目录下所有 php 结尾的文件跳转

  • 实验需求:
    要求访问http://www.kgc.com/upload/1.php 跳转到首页 。
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf
location ~* /upload/.*\.php$ {rewrite (.+) http://www.njit.com permanent;}
[root@localhost ~]# systemctl restart nginx

在win10虚拟机中进行测试
在这里插入图片描述
在这里插入图片描述

4.6 基于最普通一条 url 请求的跳转

URL(uniform resource locator)的中文名称是“统一资源定位系统”,是因特网的万维网服务程序上用于指定信息位置的表示方法。

  • 实验需求
    要求访问一个具体的页面跳转到首页。
    类似于逛淘宝时没有登录,看到了心仪的商品点击加入购物车,会自动跳转出登录页面。
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf location ~* ^/abc/test.html {rewrite (.+) http://www.njit.com permanent;}
[root@localhost ~]# systemctl restart nginx

在win10进行测试

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_898119.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RHCE ---给openlab搭建web网站

首先先把防火墙关闭并且下载好ssl [rootlocalhost li]# systemctl stop firewalld[rootlocalhost li]# setenforce 0[rootlocalhost li]# yum install mod_ssl 1.基于域名www.openlab.com可以访问网站内容为welcome to openlab 先制作服务器证书 req -newkey rsa:4096 -node…

大型网站架构演进历程

大型网站架构演进历程 Web1.0 静态网站Web2.0应用服务和数据分离使用缓存改善网站性能使用应用服务器集群改善网站的并发处理能力数据库读写分离使用搜索引擎业务拆分分布式服务 Web1.0 静态网站 大型网站都是从小型网站发展起来的 网站架构也是一样 网站刚开始搭建处于雏形阶段…

18个优秀的在线图片编辑服务网站

18个优秀的在线图片编辑服务网站 作者:Jason Ng 说起编辑图片&#xff0c;可能大多数人都会马上想起强大的Photoshop。事实上&#xff0c;除了购买或下载盗版的PS之外&#xff0c;你还可以使用很多优秀在线图片编辑服务&#xff0c;这些网站大多数都是免费的。对于大部分的…

网站被微信浏览器拦截怎么办 微信屏蔽网址打开如何解决

先来认识一下微信屏蔽的原理。按原理逐个攻破&#xff0c;整理如下&#xff1a;微信屏蔽的原理 一、微信系统的两个检测手段&#xff1a;第一是系统的自动检测&#xff1b;第二是微信工作人员的人工检测。 二、 人工的检测很好理解&#xff0c;有用户投诉举报&#xff0c;在多…

安全参透之旅第2章 FOCA网站元数据侦查工具

什么是元数据&#xff1f;就是有关数据的数据。它是有关特定数据集、对象或资源的描述性信息&#xff0c;包括所采用的格式及其创建时间和创建者。 对于参透测试人员&#xff0c;元数据可能很有用&#xff0c;因为它含有跟创建文件的系统有关的信息&#xff0c;比如&#xff1…

kali攻防第6章 SQLMAP介绍及ASP网站渗透

SQLMAP介绍及ASP网站渗透 准备工具 1、kali_linux系统 IP 10.10.10.131 3、Sqlpmap 入注工具 步骤&#xff1a; 1、 -u “检测是否存在注入” 返回数据库的名字 2、 3、 4、 参数解释&#xff1a; 1、user 根据经验 确定这是用户表 2、--columns 猜列表名 根…

kali攻防第7章 SQLMAP介绍之PHP网站渗透

SQLMAP介绍之PHP网站渗透 准备工具 1、KALI攻击系统IP :10.10.10.131 2、受害网站&#xff1a; 3、Sqlmap 入注工具 步骤&#xff1a; 1、检测&#xff1a;Sqlmap -u “” 2、sqlmap -u "" --is-dba 3、sqlmap -u “” --dbs 4、sqlmap -u “” --current-db …

python爬取动态网站实例——以爬取豆瓣电影分类排行榜为例

最近在编写 python 爬虫的时候&#xff0c;发现有时候爬取的网页和实际看到的效果不一致&#xff0c;经过各种搜索之后发现这时因为网页在加载的时候动态加载的结果&#xff0c;所以&#xff0c;为了可以获得相应的结果&#xff0c;需要模拟相应的请求。本文以 豆瓣电影排行榜 …

python爬取有声小说网站实现自动下载实例

最近想下载一些有声小说&#xff0c;但是苦于没有找到批量下载&#xff0c;每次都是单集单集的下载的&#xff0c;觉得很麻烦&#xff0c;就考虑用python写一个爬虫来实现自动搜集小说&#xff0c;自动下载。下面就是开始展开漫漫的爬虫之路。 基础的就不多说了&#xff0c;重…

如何拥有(建)一个自己的网站-虚拟主机建站

如何拥有(建)一个自己的网站-基础 如何拥有(建)一个自己的网站-准备 1.拥有一个虚拟主机 2.登录进入虚拟主机 3.点击进入域名绑定 域名绑定相当于让主机认可来自域名的访问&#xff0c;同时认可它访问主机上存放的内容。 服务器建站也有类似操作。 点击确定 即可 4.域名解析…

如何拥有(建)一个自己的网站-服务器建站

如何拥有(建)一个自己的网站-基础 如何拥有(建)一个自己的网站-准备 上面是一些需要知道的东西 1.拥有一台服务器 可以前往各大厂商购买&#xff0c;比方说腾讯云&#xff0c;阿里云等等&#xff0c;就不推荐了。 2.服务器可以选Linux系统 这里用Debian演示 3.SSH连接到服…

Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

网站日志分析项目案例&#xff08;一&#xff09;项目介绍&#xff1a;当前页面 网站日志分析项目案例&#xff08;二&#xff09;数据清洗&#xff1a;http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例&#xff08;三&#xff09;统计分析&#xff1a;…

Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗

网站日志分析项目案例&#xff08;一&#xff09;项目介绍&#xff1a;http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例&#xff08;二&#xff09;数据清洗&#xff1a;当前页面 网站日志分析项目案例&#xff08;三&#xff09;统计分析&#xff1a…

Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析

网站日志分析项目案例&#xff08;一&#xff09;项目介绍&#xff1a;http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例&#xff08;二&#xff09;数据清洗&#xff1a;http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例&#…

如何从0到1搭建站内搜索?

** 一、为什么要做站内搜索 ** 对于一个单独的内容站来说&#xff0c;搜索其实不算是用户的常用功能&#xff0c;因为在绝大部分情况下&#xff0c;用户会更加偏向于询问他人&#xff0c;也就是传说中的伸手党。当无法从他人获取自己想要的内容时&#xff0c;用户才会倾向于去…

大型网站框架的演变

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变 的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什…

10个学习Android开发的网站推荐

1. Android Developers 作为一个Android开发者&#xff0c;官网的资料当然不可错过&#xff0c;从设计&#xff0c;培训&#xff0c;指南&#xff0c;文档&#xff0c;都不应该错过&#xff0c;在以后的学习过程中慢慢理解体会。 2. Android Guides - CodePath CodePath是国外一…

网站前端性能优化之javascript和css

之前看过Yahoo团队写的一篇关于网站性能优化的文章&#xff0c;文章是2010年左右写的&#xff0c;虽然有点老&#xff0c;但是很多方面还是很有借鉴意义的。关于css的性能优化&#xff0c;他提到了如下几点&#xff1a; CSS性能优化 1、把样式表置于顶部 现把样式表放到文档…

腾讯云轻量级服务器宝塔快速部署网站

1&#xff1a;首先我们可以登录腾讯云的官网。购买一个轻量级的服务器&#xff0c;这个服务器是很便宜的。第一次购买。 购买成功以后&#xff0c;我们会收到短信&#xff0c;短信会提示你已经购买成功。我们这个时候可以进入到控制台。 到了自己的控制台以后&#xff0c;我们要…