LInux系统架构----Nginx模块rewrite的规则与应用场景

LInux系统架构----Nginx模块rewrite的规则与应用场景

一.rewrite跳转实现

  • Nginx实现跳转通过ngx_http_rewrite_module模块
  • 支持URL重写、支持if条件判断,但是不支持else
  • 跳转时,循环最多可以执行10次,超过后nginx将返回500错误注:http状态码,100 Continue,200 OK(请求成功),300 Multiple Choices (重定向),400(请求错误)Bad Request (语义有误),403 Forbidden (权限不足),404 Not Found (请求失败),5 、6开头服务器错误
  • rewrite使用Nginx全局变量或自己设置的变量,结合正则表达式和标志位实现URL重写以及重定向,prce语言支持,重写模块set指令
注:http状态码,100 Continue,200 OK(请求成功),300 Multiple Choices (重定向),400(请求错误)Bad Request (语义有误),403 Forbidden (权限不足),404  Not Found (请求失败),5 、6开头服务器错误

二.rewrite实用场景

  • 使用rewrite进行匹配跳转
  • 使用if匹配全局变量后跳转
  • 使用location匹配在跳转
  • rewrite模块放在server{},if{},location{}段中
  • 对于域名或者参数字符串:使用if全局变量匹配;使用proxy_pass反向代理
注:rewrite不能放在http协议段中

三.Nginx正则表达式

字符说明
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或者多次
+匹配前面的字符一次或者多次
?匹配前面的字符零次或者一次
.匹配除了\n之外的任何单个字符。使用诸如“[.\n]”之类的模式,可以匹配包括\n在内的任何字符
\将后面接着的字符标记为一个特殊字符或一个原义字符或者一个向后引用
\d匹配纯数字
{n}重复n次
{n,m}重复n次到m次v
[c]匹配单个字符c
[a-z]匹配a-z小写字母的任意一个
[a-zA-Z]匹配a-z小写字母或者A-Z大写字母的任意一个

四.rewrite命令

rewrite语法

rewrite <regex>    <replacement> [flag];

flag标记说明

标记说明
last相当于Apache的【L】标记,表示完成rewrite
break本条规则匹配完成即终止,不再匹配后面的任何规则
redirect返回302临时重定向,浏览器地址会显示跳转后URL地址,爬虫不会更新url
permanent返回301永久重定向,浏览器地址栏会显示跳转后的url地址,爬虫更新url
注:URL:在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位符),它是WWW的统一资源定位标志,就是指网络地址。
爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本

last和break的比较

lastbreak
使用场景一般写server和if中一般使用在location中
不终止重写后的url匹终止重写后的url匹配

五.location

location的分类

location=patt {}{精准匹配}
location patt {}{一般匹配}
location ~ patt {}{正则匹配}

正则匹配的常用表达式

标记说明
~执行一个正则匹配,区分大小写
~*执行一个正则匹配,不区分大小写
!~执行一个正则匹配,区分大小写不匹配
!~*执行一个正则匹配,不区分大小写不匹配
^~普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location
=普通字符的精确匹配。也就是完全匹配
@定义一个命名的location,使用在内部定向时
  • location的优先级

  • 相同类型的表达式,字符串长的会优先匹配,下列按优先级排列,优先级从小到大

= < ^~ < ~和~* < 常规字符匹配< 通配符/

location优先级规则
匹配某个具体文件

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

用目录做匹配访问某个文件

(location = 目录)> (location ^~ 目录/) > (location ~ 目录) >(location ~* 目录) > (location 目录) > (location /)
  • location的优先级示例
location = / { [ configuration A ] }精确匹配/,主机名后面不能带任何字符串
location / { [ configuration B ] }所有的地址都以/开头,这条规则匹配到所有请求,但正则和最长字符串会优先匹配
location /documents/ { [ configuration C ]匹配任何以/documents/开头的地址,当后面的正则表达式没有匹配到时,才起作用
location /documents/abc { [ configuration D ] }匹配任何以/documents/abc开头的地址,当后面的正则表达式没有匹配到时,才起作用
location ^~ /images/ { [ configuration E ]}以/images/开头的地址,匹配符合后,停止往下匹配
location ~* .(gif|jpg|swf)${ [ configuration F ] }匹配所有以jpg、gif、swf结尾的请求,/images/下的图片会被[configuration E]处理,因为 ^~的优先级更高
location /images/abc { [ configuration G ] }最长字符匹配到 /images/abc,优先级最低
location ~ /images/abc { [ configuration H ] ]以/images/abc开头的,优先级次之
location /images/abc/1.html { [ configuration I ] }如果和正则~ /images/abc/1.html相比,正则优先级更高

六.rewrite与location比较

  • 相同点

都能实现跳转

  • 不同点

rewrite是在同一域名内更改获取资源的路径
location是对一类路径做控制访问或者反向代理,还可以proxy_pass到其他机器

  • rewrite会写在location里,执行顺序

执行server块里面的rewrite指令
执行location匹配
执行选定的location中的rewrite指令

七.基于域名跳转

源主机测试机
IP地址:10.1.1.171IP地址:10.1.1.172
旧域名:www.kgc.com
新的域名:www.yun.com
  • 实验场景:公司有旧域名 www.kgc.com,因为有业务变更,使用新的域名 www.yun.com
  • 实验要求;不废除旧域名,从旧域名跳转到新的域名,保持参数不变
[root@server1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.1.171 www.kgc.com
10.1.1.171 www.yun.com

验证nginx服务

在这里插入图片描述

#添加域名跳转功能

##在nginx配置文件中配置跳转功能
[root@server1 ~]# vim /etc/nginx/nginx.conf
    location / {
                if ($host = 'www.kgc.com'){
                rewrite ^/(.*)$ http://www.yun.com/$1 permanent;
               }
               root   html;
               index  index.html index.htm;
            } 
[root@server1 ~]# systemctl restart nginx

验证域名转换服务

在这里插入图片描述

八基于客户端IP地址跳转

  • 实验场景:公司网页维护,外部的IP地址访问都只显示一个固定维护页面,只有公司的IP地址才能正常访问页面
服务器IP地址:10.1.1.171
公司的IP地址:10.1.1.172
外部客户的IP地址10.1.1.173
  • 基于前面的场景的nginx服务,关闭域名转换功能,添加IP地址跳转功能
[root@server1 ~]# vim /etc/nginx/nginx.conf
   location / {
                   set $rewrite true;
                   if ($remote_addr = "10.1.1.172"){
                      set $rewrite false;
                   }
                   if ($rewrite = true){
                      rewrite (.+) /main.html;
                   }
                   location = /main.html {
                        root /usr/share/nginx/html;
                   }
                   root   html;
                   index  index.html index.htm;
            } 
 [root@server1 ~]# systemctl restart nginx
 ##公司网页维护页面
 [root@server1 ~]# vim /usr/share/nginx/html/main.html
<html>
        <head>
                <meta charset="utf-8">
                <title></title>
        </head>
        <body>
                <h2>抱歉,网站维护中!</h2>
                </body>
</html>

公司内部10.1.1.172访问服务器

[root@server2 ~]# hostname -I
10.1.1.172 
[root@server2 ~]# curl http://10.1.1.171/test.html
this is a gongsi web page

外部客户机上访问服务器

[root@test121 ~]# hostname -I
10.1.1.173 
[root@test121 ~]# curl 10.1.1.171/test.html
<html>
        <head>
                <meta charset="utf-8">
                <title></title>
        </head>
        <body>
                <h2>抱歉,网站维护中!</h2>
                </body>
</html>

九.基于参数匹配跳转

  • 例如:浏览器访问,http://www.kgc.com/100-100.html,会自动跳转到http://www.kgc.com
  • 修改nginx的配置文件
[root@PXE ~]# vim /etc/nginx/nginx.conf
location / {
                if ($request_uri ~ ^/100-100.html$) {
                   rewrite (.*) http://www.kgc.com permanent;
                }
        }
[root@PXE ~]# systemctl restart nginx.service 

在这里插入图片描述

  • 自动跳转为下列页面

在这里插入图片描述

十.基于目录下所有php文件跳转

  • 例如,当我们访问,http://www.kgc.com/hello/1.php,会自动跳转到,www.kgc.com
  • 修改nginx配置文件
[root@PXE ~]# vim /etc/nginx/nginx.conf
[root@PXE ~]# systemctl restart nginx.service 

验证是否成功

在这里插入图片描述

跳转到

在这里插入图片描述

十一.基于最普通url请求跳转

  • 例如,当我们访问某个具体的页面,http://www.kgc.com/a.html都会帮我们转到www.kgc.com
  • 访问http://www.kgc.com/a.html

在这里插入图片描述

  • 修改配置
  • 访问,http://www.kgc.com/a.html,会跳转到www.kgc.com

验证是否成功
在这里插入图片描述

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

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

相关文章

0基础使用dockerfile构建容器镜像

目录 一、使用dockerfile构建镜像 1.1、dockerfile指令 1.FROM 2.RUN 3.CMD 4.ENTRYPOINT 5.EXPOSR ​编辑 6.ADD和COPY ​编辑7.volume 8.USER 二、案例1&#xff1a;dockerfile构建httpd镜像 构建一个指定挂载点的httpd镜像 三、案例2&#xff1a;构建tomcat镜…

使用endnote插入引用文献导致word英文和数字变成符号的解决方案

使用endnote插入引用文献导致word英文和数字变成符号的解决方案 如图使用endnote插入引用文献导致word英文和数字变成符号字体Wingdings Wingdings 是一个符号字体系列&#xff0c;它将许多字母渲染成各式各样的符号&#xff0c;用途十分广泛。 **解决方法&#xff1a;**直接通…

【相关问题解答1】bert中文文本摘要代码:import时无法找到包时,几个潜在的原因和解决方法

【相关问题解答1】bert中文文本摘要代码 写在最前面问题1问题描述一些建议import时无法找到包时&#xff0c;几个潜在的原因和解决方法1. 模块或包的命名冲突解决方法&#xff1a; 2. 错误的导入路径解决方法&#xff1a; 3. 第三方库的使用错误解决方法&#xff1a; 4. 包未正…

gpt-4-all模型中转实现

最近才完成这个功能&#xff0c;相信知道这个模型的人&#xff0c;应该已经熟悉了。这是我的中转&#xff1a;openai-api Chatbox配置如下&#xff1a; 模型测试&#xff1a; 1&#xff09;图片生成 2&#xff09;文件分析&#xff0c;链接读取&#xff1a;

WPF实时时间显示demo(MVVM)

跟着b站的视频学习做一个界面,它里面的时间不能实时刷新,因此自己研究写一个,同时加深一下自己对MVVM的理解. 运行结果: 实现步骤: 1.界面 界面设计就是放置了一个TextBlock,它的text绑定了ViewModel层里面的公告属性CurrentTime. <Grid><TextBlock Text"{Bindi…

【Vite+Ts】自动按需引入Element-Plus

安装插件 cnpm i -D unplugin-vue-components unplugin-auto-import unplugin-element-plus修改vite.config.ts // vite.config.ts import AutoImport from "unplugin-auto-import/vite"; import Components from "unplugin-vue-components/vite"; impor…

白嫖AWS云服务器,验证、注册指南

背景 不知道你想不想拥有一台属于自己的云服务器呢&#xff0c;拥有一台自己的云服务器可以建站&#xff0c;可以在上面搭建个人博客&#xff0c;今天我就来教大家如何申请亚马逊 AWS 免费云服务器&#xff0c;这个云服务器可以长达12个月的免费。而且到期后可以继续换个账号继…

【Flink SQL】Flink SQL 基础概念:SQL 动态表 连续查询

Flink SQL 基础概念&#xff1a;SQL 动态表 & 连续查询 1.SQL 应用于流处理的思路2.流批处理的异同点及将 SQL 应用于流处理核心解决的问题3.SQL 流处理的输入&#xff1a;输入流映射为 SQL 动态输入表4.SQL 流处理的计算&#xff1a;实时处理底层技术 - SQL 连续查询5.SQL…

Arduino IDE的下载和安装

一、Arduino的介绍 Arduino是一款开源电子原型平台&#xff0c;主要包含两部分&#xff1a;硬件&#xff08;各种型号的Arduino板&#xff09;和软件&#xff08;Arduino IDE&#xff09;。这个平台由意大利的Massimo Banzi、David Cuartielles等人共同开发设计&#xff0c;并于…

OPPO后端二面,凉了!

这篇文章的问题来源于一个读者之前分享的 OPPO 后端凉经&#xff0c;我对比较典型的一些问题进行了分类并给出了详细的参考答案。希望能对正在参加面试的朋友们能够有点帮助&#xff01; Java String 为什么是不可变的? public final class String implements java.io.Seri…

【毕设级项目】基于嵌入式的智能家居控制板(完整工程资料源码)

基于嵌入式的智能家居控制板演示效果 基于嵌入式的智能家居控制板 前言&#xff1a; 随着科技的不断进步&#xff0c;物联网技术得到了突飞猛进的发展。智能家居是物联网技术的典型应用领域之一。智能家居系统将独立家用电器、安防设备连接成一个具有思想的整体&#xff0c;实现…

清华把大模型用于城市规划,回龙观和大红门地区成研究对象

引言&#xff1a;参与式城市规划的新篇章 随着城市化的不断推进&#xff0c;传统的城市规划方法面临着越来越多的挑战。这些方法往往需要大量的时间和人力&#xff0c;且严重依赖于经验丰富的城市规划师。为了应对这些挑战&#xff0c;参与式城市规划应运而生&#xff0c;它强…

汽车IVI中控开发入门及进阶(十四):功能安全

前言: 是时候需要来说一下功能安全了,有没有发现现在很多主机厂、Tier1对芯片等BOM物料有些是有功能安全需求的,那么什么是功能安全呢? 车辆中电子元件数量的增加增加了更多故障的可能性,对驾驶员和乘客的风险更高。这种风险的增加导致汽车行业将功能安全标准作为汽车设计…

C库函数-getopt函数总结学习

1、简介 getopt函数是命令行参数解析函数 1、1命令行组成 Command name 程序文件名 operands 操作对象 option 选项 option argument 选项参数 getopt()函数将传递给mian()函数的argc,argv作为参数&#xff0c;同时接受字符串参数optstring – optstring是由选项Option字母组…

cesiumlab中shp转3dtiles白模效果一

安装cesiumlab 如果没有安装cesiumlab&#xff0c;去官网下载安装一个即可 http://www.cesiumlab.com/cesiumlab.html 效果 步骤 1、准备shp面数据 2、打开cesiumlab软件转换 选择shp面数据 设置高度&#xff0c;如果shp面中有高度字段&#xff0c;可以用高度字段&#xff…

高铁列车员信息宣传向媒体投稿有哪些方法?

作为一名高铁列车工作人员,我肩负着传递高铁精神、展示列车员风采的重要使命。每月,我都要完成单位对外信息宣传的考核任务,通过媒体投稿来发表列车员的信息宣传文章。在这条信息宣传之路上,我经历了从摸着石头过河到智慧投稿的蜕变,其中的心酸与轻松交织,成为了我职业生涯中难…

云原生消息流系统 Apache RocketMQ 在腾讯云的大规模生产实践

导语 随着云计算技术的日益成熟&#xff0c;云原生应用已逐渐成为企业数字化转型的核心驱动力。在这一大背景下&#xff0c;高效、稳定、可扩展的消息流系统显得尤为重要。腾讯云高级开发工程师李伟先生&#xff0c;凭借其深厚的技术功底和丰富的实战经验&#xff0c;为我们带…

基于C++的一种字符串切分方法及示例代码

一、概述 在 Java 和 python 中&#xff0c;都有实现字符串切分的方法&#xff0c; 如split() &#xff0c;使用起来较为方便&#xff0c;但是在标准的 C 中&#xff0c;却没有内置的 split() 方法。 我们可以使用标准库中的一些函数和方法来实现字符串的切分&#xff0c;这里…

【报错 - npm包问题】 token.type.endsWith is not a function

将 babel-eslint 10.1.0版本&#xff0c;降为 8.2.2 npm install babel-eslint8.2.2 --save

[云原生] Prometheus理论知识及系统搭建

promethues是一个开源的系统监控和报警系统&#xff0c;现在已经加入到CNCF基金会&#xff0c;成为继k8s之后第二个在CNCF托管的项目&#xff0c;在kubernetes容器管理系统中&#xff0c;通常会搭配prometheus进行监控&#xff0c;同时也支持多种exporter采集数据&#xff0c;还…
最新文章