• Nginx Rewrite


    Nginx Rewrite概述

    现在Nginx已经成为很多公司作为前端反向代理服务器的首选,在实际工作中往往会遇到很多跳转(重写URL)的需求。比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。如果在后端使用的Apache服务器,虽然也能做跳转,规则库也很强大,但是用Nginx跳转效率会更高,这也是学习本章的目的所在。

    1.Rewrite跳转场景

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

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

    2.Rewrite跳转实现

    Nginx是通过ngx_htp_rewrite_module模块支持url重写、支持if条件判断,但不支持else。另外该模块需要PCRE支持,应在编译Nginx时指定PCRE支持,默认已经安装。

    根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后Nginx将返回500错误。同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。rewrite功能就是使用Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。

    3.Rewrite实际应用场景

    在实际工作的应用中,Nginx跳转需求有三种方式可实现。可以直接用rewrite进行匹配跳转,也可以使用f匹配全局变量后跳转。另外,还可以使用1 ocation匹配再跳转。所以rewrite只能放在server{}、f{}、location{}配置段中。例如location只能对域名后边的除去传递的参数外的字符串起作用,例如htp://www.kgc.com/index.php?id=1只对/index.php重写。如果想对域名或参数字符串起作用,可以使用if全局变量匹配,也可以使用proy_pass反向代理。

    4.Nginx正则表达式

    学习Rewrite之前要熟悉正则表达式,表7-2中列举出一些常用的正则表达式元字符。
    要深刻理解和学习每个元字符的含义,并且多动手进行实验,在实际生产环境中要结合多个元字符一起使用。

    Nginx Rewrite基本操作

    Rewrite语法

    Rewrite命令的语法如下所示,其中regex表示正则匹配规则、replacement表示跳转后的内容、flag表示rewrite支持的flag标记。

    flag标记说明:

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

    如果后面不跟fg标记,那么默认是302临时重定向。在实际工作场景中,还有另一种return指定。因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301和302的原因。

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

    Location分类

    location大致可以分为三类,语法如下:

    • location=pat{}[精准匹配]
    • location patt{}[一般匹配]
    • location~patt{}[正则匹配]

    精准匹配和一般匹配不需要做详细的说明,主要是正则匹配。下面就是正则匹配的一些表达式,需要多加牢记。

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

    Location优先级

    在Nginx的location配置中location的顺序没有太大关系。匹配优先级和location表达式的类型有关:相同类型的表达式,字符串长的会优先匹配。

    以下是按优先级排列说明:

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

    从功能看rewrite和location似乎有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,还可以proxy._pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序如下:

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

    下面根据不同的Location优先级进行示例说明。

    对location优先级进行总结。

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

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

    Rewrite常见示例

    1.安装Nginx服务

    2.修改Nginx默认站点配置文件

    修改/etc/nginx/conf.d/default.conf文件中如下两行红色字体。

    3.Rewrite示例

    需要注意的是,在做每一步场景测试之前请确定www.kgc.com域名可以正常解析,每做下一个场景之前请删除上一个场景的配置。另外,要清除浏览器缓存。

    (1)基于域名的跳转

    假如,现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.newkgc.com代替,但是I旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变在/etc/nginx/conf.d/default.conf文件里的location/下面添加如下内容。

    域名直接跳转

    按F12可以清楚的看到从I旧域名www.kgc.com跳转到了新域名www.newkgc.com上,状态码是301永久重定向。页面效果如图7.1所示。

    域名后面加参数跳转

    因为在代码中很多请求是带参数的,所以要保证参数都能正常跳转。浏览器输入模拟访问http://www.kgc.com/test/1 index.php(虽然这个请求内容是不存在的)跳转到
    http://www.newkgc.com/test/1 /index.php,可以看到301实现了永久重定向跳转,而且域名后的参数也正常跳转,如图7.2所示。

    (2)基于客户端P访问跳转

    例如今天公司业务版本上线,要求所有P访问任何内容都显示一个固定维护页面,只有公司IP访问正常。在/etc/nginx/.conf.d/default.conf文件里添加如下内容。

    只有P为192.168.6.125能正常访问,其它地址都是维护页面,使用一个局域网的其它IP地址用浏览器访问http://www.kgc.com域名和加参数都是请求的maintenance.html页面的内容,而且状态码是200,如图7.3所示。

    浏览器使用http://ww.kgc.com/test带参数访问也是显示维护页面内容,如图7.4所示。

    (3)基于旧域名跳转到新域名后面加目录

    例如现在访问的是http://bbs.kgc.com,现在需要将这个域名下面的发帖都跳转到
    http://ww.kgc.com/bbs,注意保持域名跳转后的参数不变。在/etc/nginx/conf..d/default.conf文件里修改如下内容。

    模拟使用浏览器访问http://bbs.kgc.com/post/1.php跳转到http://www.kgc.com/bbs/post/1.php,如图7.5所示。

    (4)基于参数匹配的跳转

    例如现在访问http://www.kgc.com/100-(100200)-100.html跳转到htp://www.kgc.com页面。在/etc/nginx/conf..d/default.conf文件里添加如下内容。

    使用浏览器访问http://www.kgc.com/100-100-100.html,如图7.6所示。

    使用浏览器访问http://www.kgc.com/100-200-100.html,如图7.7所示。

    (5)基于目录下所有php结尾的文件跳转

    要求访问http://www.kgc.com/upload/.1.php跳转到首页。在/etc/nginx/conf.d/default..conf文件里添加如下内容。

    浏览器访问http://w.kgc.com/upload/1.php,如图7.8所示。

    (6)基于最普通一条ul请求的跳转

    要求访问一个具体的页面跳转到首页,在/etc/nginx/conf.d/default.conf文件里添加如下内容。

    浏览器访问http:w.kgc.com/1test.html跳转到首页,如图7.9所示。

  • 相关阅读:
    随机分布式延迟PSO(RODDPSO)+K-Means算法(Python代码实现)
    【设计模式】工厂方法模式
    UDS诊断:87服务-LinkControl(链接控制服务)
    曲线艺术编程 coding curves 第七章 抛物线(Parabolas)
    读书笔记-《麦肯锡方法》
    2023年【熔化焊接与热切割】考试试卷及熔化焊接与热切割试题及解析
    leetcode 题目
    Java / Android 线程间通信
    一文掌握数仓中auto analyze的使用
    休闲卤味的商业江湖里,周黑鸭的巨变与出路
  • 原文地址:https://blog.csdn.net/yiluo__/article/details/139799228