小阿轩yx-Nginx Rewrite

小阿轩yx-Nginx Rewrite

Nginx Rewrite 概述

  • 现在 Nginx 已经成为很多公司作为前端反向代理服务器的首选

实际工作中会遇到很多跳转(重写 URL)的需求

  • 更换域名后需要保持旧的域名能跳转到新的域名上
  • 某网页发生改变需要跳转到新的页面
  • 网站防盗链等等需求

后端使用的Nginx 服务器与Apache 服务器

区别

  • Apache 服务器虽然也能做跳转,规则库也很强大
  • 用 Nginx 跳转效率会更高(注:更有优势)

Rewrite 跳转场景包括

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

Rewrite 跳转实现

Nginx 是通过 ngx_http_rewrite_module 模块

  • 支持 url 重写
  • 支持if条件判断
  • 另外该模块需要 PCRE 支持
  • 应在编译 Nginx 时指定 PCRE 支持,默认已经安装

缺点

  • 不支持 else

根据相关变量重定向和选择不同的配置

从一个location 跳转到另一个location

  • 不过这样的循环最多可以执行 10 次
  • 超过后 Nginx 将返回 500 错误

同时,重写模块包含 set 指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。

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

Rewrite 实际应用场景

实际工作的应用中,Nginx跳转需求有三种方式可实现

  • 可以直接用rewrite 进行匹配跳转
  • 也可以使用if匹配全局变量后跳转
  • 另外,还可以使用location 匹配再跳转

所以rewrite 只能放在 server{}、f、location{}配置段中

Nginx 正则表达式

字符描述
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
 
*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”
+“ol!”匹配前面的字符一次或多次。如“ol+”能匹配“o!"及“ol!”、“ol!”,但不能匹配“o”
?匹配前面的字符零次或一次,例如“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 大写字母的任意一个

Nginx Rewrite 基本操作

Rewrite 语法

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

flag 标记说明

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

(注:如果后面不跟 fag 标记,那么默认是 302 临时重定向

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

last 和 break 区别

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

Location 分类

location 大致可以分为三类

  • location = patt {} [精准匹配]

  • location patt {} [一般匹配]

  • location ~ patt {} [正则匹配]

(注:精准匹配和一般匹配不需要做详细的说明,主要是正则匹配)

[root@localhost ~]# mkdir -p /var/www/html/aaa
[root@localhost ~]# mkdir -p /var/www/html/bbb
[root@localhost ~]# mkdir -p /var/www/html/ccc[root@localhost ~]# echo "aaa">/var/www/html/aaa/aaa.html
[root@localhost ~]# echo "bbb">/var/www/html/bbb/index.html
[root@localhost ~]# echo "ccc">/var/www/html/ccc/INDEX.html
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conflocation / {root   /var/www/html/aaa;index  index.html aaa.html;}location = /index.html {root   /var/www/html/bbb;index  index.html index.htm;}location ~ /INDEX.html {root   /var/www/html/ccc;index  index.html index.htm INDEX.html;}

(注:

http://192.168.10.101

访问到的是aaa

http://192.168.10.101/index.html

访问到的是bbb

http://192.168.10.101/INDEX.html

访问到的是ccc)

正则匹配的一些表达式

  • ~:表示执行一个正则匹配,区分大小写

  • ~*:表示执行一个正则匹配,不区分大小写

  • > !~:表示执行一个正则匹配,区分大小写不匹配

  • !~":表示执行一个正则匹配,不区分大小写不匹配

  • ^~:表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他 location

  • =:进行普通字符精确匹配,也就是完全匹配

  • @:它定义一个命名的 location,使用在内部定向时,例如 error_page, try _files

Location 优先级 

Nginx location 配置中 location 的顺序没有太大关系

匹配优先级和 location 表达式的类型有关

  • 相同类型的表达式

  • 字符串长的会优先匹配

按优先级排列说明

  • 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项

  • ^~类型表达式。一旦匹配成功,则不再查找其他匹配项

  • 正则表达式类型(~~*)的优先级次之

  • 常规字符串匹配类型。按前缀匹配

  • 通用匹配(/),如果没有其它匹配,任何请求都会匹配到

(注:= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求)

从功能看 rewrite 和 location 似乎有点像,都能实现跳转

主要区别

  • rewrite 是在同一域名内更改获取资源的路径
  • 而location 是对一类路径做控制访问或反向代理
  • 还可以proxy_pass 到其他机器
  • 很多情况下rewrite 也会写在 location 里

执行顺序

  • 执行server块里面的 rewrite 指令
  • 执行location 匹配
  • 执行选定的 location 中的 rewrite 指令
#精确匹配 / ,主机名后面不能带任何字符串
location = / { [ configuration A ] 
}# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求,但是正则和最长字符串会优先匹配
location / { [ configuration B ] 
}# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续向下搜索,只有后面的正则表达式没有匹配到时,这一条才会起作用 
location /documents/ { [ configuration C ] 
}# 匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续向下搜索,只有后面的正则表达式没有匹配到时,这一条才会起作用 
location ~ /documents/abc { [ configuration D ] 
}# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止向下匹配 
location ^~ /images/ { [ configuration E ] 
}# 匹配所有以 gif,jpg 或 jpeg 结尾的请求,然而所有请求/images/下的图片会被 [ configuration E] 处理,因为^~的优先级更高 
location ~* \.(gif|jpg|jpeg)$ { [ configuration F ] 
}# 最长字符匹配到 /images/abc,优先级最低 
location /images/abc { [ configuration G ] 
}# 匹配以/images/abc 开头的,优先级次之 
location ~ /images/abc { [ configuration H ] 
}# 匹配/images/abc/1.html 文件,如果和正则~ /images/abc/1.html 相比,正则优先级更高
location /images/abc/1.html { [ configuration I ] 
}

(总结:

如果是匹配某个具体文件

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

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

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

Rewrite 常见示例

案例环境

  • 192.168.10.101 www.benet.com 

  • 192.168.10.102 www.accp.com

设置好客户端和服务器端的hosts文件

浏览器访问www.benet.com,跳转到www.accp.com

安装 Nginx 服务

[root@localhost ~]# rpm -Uvh http:/nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@localhost ~]# yum -y install nginx

修改 Nginx 默认站点配置文件

[root@localhost ~l# vim /etc/nginx/conf.d/default.conf
server {listen    80:server name ww.kgc.com;#charset koi8-r;
access log /var/log/nginx/www.kgc.com-access.logmain:
location /{
root    /usr/share/nginx/html;
index index.html index.htm;
#error_page 404    /404.html;
…./省略部分
[root@localhost ~]# systemctl start nginx

Rewrite 示例

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

flag 标记说明

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

基于域名的跳转

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.confserver {listen       80;server_name  www.benet.com;charset utf-8;#access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;if ($host = 'www.benet.com') {rewrite ^/(.*)$ http://www.accp.com/$1 permanent;}}
}
[root@localhost ~]# systemctl restart nginx

 域名直接跳转

  • F12 可以清楚的看到从旧域名 www.benet.com 跳转到了新域名 www.accp.com 上,状态码是 301 永久重定向

  • b:域名后面加参数跳转

基于客户端 IP 访问跳转

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.confserver {listen       80;server_name  www.benet.com;#access_log  /var/log/nginx/host.access.log  main;set $rewrite true;if ($remote_addr = "192.168.10.51") {set $rewrite false;}if ($rewrite = true) {rewrite (.+) /maintenance.html;}location / {root   html;index  index.html index.htm;#	if ($host = 'www.benet.com') {
#	  rewrite ^/(.*)$ http://www.accp.com/$1 permanent; 
#	}}
}
  • (.+)  匹配整个URL,匹配上以后,就在URL后面加上/maintenance.html

  • .+  匹配任意字符1次或多次

  • .*  匹配任意字符0次或多次

[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# echo "Website is Maintaining,Please visit later."> /usr/local/nginx/html/maintenance.html

(注:

$host = 'www.benet.com'  判断获取到得请求URL是否为www.benet.com     另外,=号两边有空格

permanent:返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址,爬虫更新 url,没有则返回302)

^/(.*)$

  • ^  指的是以任何字符或字符串开始的域名都会匹配上

  • /  指得是url后跟的/,比如www.benet.com/index.html

  • .*  匹配任意多个字符,注意这里的(),括号里的内容会用后面的$1调用

  • $   结尾

(注:Rewrite 语法rewrite<regex><replacement>[flag];

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

[root@localhost html]# cd /usr/local/nginx/html/
[root@localhost html]# mkdir -p bbs/post
[root@localhost html]# cd bbs/post
[root@localhost post]# echo "i am bbs">index.html
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  bbs.benet.com;#access_log  /var/log/nginx/host.access.log  main;location /post {rewrite (.+) http://www.benet.com/bbs$1 permanent;}location / {root   html;index  index.html index.htm;}
}
[root@localhost ~]# systemctl restart nginx

客户端添加域名解析

  • 192.168.10.101 bbs.benet.com

基于参数匹配的跳转

root@localhost post]# vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  bbs.benet.com;#access_log  /var/log/nginx/host.access.log  main;if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {rewrite (.*) http://www.benet.com permanent;}location / {root   html;index  index.html index.htm;}
}
  • \d+  匹配任意个数字

[root@localhost ~]# systemctl restart nginx

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

[root@localhost post]# vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  bbs.benet.com;#access_log  /var/log/nginx/host.access.log  main;location ~* /upload/.*\.php$ {rewrite (.+) http://www.benet.com permanent;}location / {root   html;index  index.html index.htm;}
}

注:

  • ~*  不区分大小写

  • ~   区分大小写

  • .*\.php  一个文件的名字   名字.后缀   任意名字.php

[root@localhost ~]# systemctl restart nginx

浏览器访问 http://www.benet.com/upload/1.php会跳转到http://www.benet.com

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

[root@localhost post]# vim /usr/local/nginx/conf/nginx.confserver {listen       80;server_name  bbs.benet.com;#access_log  /var/log/nginx/host.access.log  main;location ~* ^/1/test.html {rewrite (.+) http://www.benet.com permanent; }location / {root   html;index  index.html index.htm;}
}

浏览器访问http://www.benet.com/1/test.html 跳转到http://www.benet.com

小阿轩yx-Nginx Rewrite

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

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

相关文章

SpringBoot集成slf4j日志配置

目录 前言 1、slf4j概述 2、pom.xml的日志依赖 3、application.yml的日志配置 4、logback.xml配置文件定义 5、logback.xml配置文件解析 5.1 定义日志的存储路径 5.2 定义日志的输出格式 5.3 定义控制台输出 5.4 定义日志相关参数 5.5 定义日志的输出级别 6、测试日…

利用JAVA语言调用GLM-4接口实战指南

一、什么是API接口 API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是一种软件接口&#xff0c;它定义了不同应用程序之间如何相互通信、交互。API接口分为很多种&#xff0c;常见的有Web API&#xff0c;数据库API&#xff0c;操…

Perl语言快速入门学习

1. 引言 Perl&#xff08;Practical Extraction and Report Language&#xff09;是一种功能强大且灵活的编程语言&#xff0c;广泛应用于文本处理、系统管理、网络编程等领域。本文将带领大家了解Perl语言的基础知识&#xff0c;帮助初学者快速入门。 2. 什么是Perl&#xf…

数据结构-算法和算法分析

目录 前言一、算法1.1 算法与程序1.2 算法描述方法1.3 算法特性1.4 算法设计的要求 二、算法分析2.1 算法时间效率的度量2.1.1 事前分析方法算法的渐进时间复杂度算法时间复杂度分析例子算法最坏时间复杂度时间复杂度的计算规则 2.2 算法空间效率的度量 总结 前言 程序 数据结…

如何相互转换图片格式?如何转换jpg、bmp、png格式?

图片的格式有很多种&#xff0c;常见的有jpg、bmp、png格式&#xff0c;这些格式本质上没有太大区别&#xff0c;安卓和电脑都可以直接打开查看&#xff0c;但有时还是会用到一些固定的格式&#xff0c;例如&#xff0c;上传个人信息时&#xff0c;如果图片格式不符合要求&…

参数量Params和每秒浮点运算次数FLOPs的单位是多少

先看一下yolov8的表 模型计算量(FLOPs)和参数量(Params)是衡量深度学习算法复杂度的两个重要指标&#xff0c;它们可以用来评估一个模型的性能和实用性。以下是对这两个指标的理解&#xff1a; 1、Params - 参数量 即模型中需要学习的参数数量&#xff0c;它是衡量模型复杂度的…

pytorch基础【4】梯度计算、链式法则、梯度清零

文章目录 梯度计算计算图&#xff08;Computational Graph&#xff09;梯度求导&#xff08;Gradient Computation&#xff09;函数与概念 示例代码更多细节梯度求导的过程梯度求导的基本步骤示例代码注意事项总结 链式法则是什么&#xff1f;链式法则的数学定义链式法则在深度…

VMR,支持30+种编程语言的SDK版本管理器,支持Windows/MacOS/Linux。

官方文档地址&#xff1a;documents 官方项目地址&#xff1a;github 欢迎安装使用&#xff0c;分享转发&#xff0c;前往github star。 跨平台&#xff0c;支持Windows&#xff0c;Linux&#xff0c;MacOS支持多种语言和工具&#xff0c;省心受到lazygit的启发&#xff0c;拥…

Flutter【组件】可折叠文本组件

简介 flutter 可折叠文本组件。 点击展开&#xff0c;收起折叠文本。支持样式自定义 github地址&#xff1a; github.com/ThinkerJack… pub地址&#xff1a;https://pub.dev/packages/jac_uikit 展开收起文本 使用方式&#xff1a; ExpandableText(content: 测试 * 50,ma…

qt基于QGraphicsView的屏幕旋转

一、代码实现 实现代码示例 MainWindow2 w;QGraphicsScene *scene new QGraphicsScene;QGraphicsProxyWidget *gw scene->addWidget(&w);// 旋转角度gw->setRotation(90);QGraphicsView *view new QGraphicsView(scene);//view->resize(1024, 600);//scene-&g…

生活实用口语柯桥成人外语培训机构“客服”用英文怎么说?

● 01. “客服”英语怎么说&#xff1f; ● 我们都知道“客服”就是“客户服务”&#xff0c; 所以Customer Service就是#15857575376客服的意思。 但是这里的“客服”指代的不是客服人员&#xff0c; 而是一种Service服务。 如果你想要表达客服人员可以加上具体的职位&a…

中国500米分辨率年平均LAI数据集(2000-2020)

叶面积指数LAI(Leaf Area Index)是描述植被冠层几何结构的基本参数之一&#xff0c;被定义为单位地表面积上所有叶片面积的倍数&#xff0c;它控制着植被的许多生物物理过程&#xff0c;如光合作用、呼吸作用、蒸腾作用、碳循环和降水截获等&#xff0c;是陆面过程一个十分重要…

CF 952 E.Secret Box

原题链接&#xff1a;Problem - E - Codeforces 题目大意&#xff1a;多组测试数据&#xff0c;给一个大长方体的长宽高和一个小长方体的体积&#xff0c;问小长方体最大能在大长方体里面放多少种不同的位置。 思路&#xff1a;枚举小长方体的长和宽&#xff0c;然后判断高能…

安装免费版的jfrog artifactory oss

1、下载 软件&#xff0c;本案例安装的是 jfrog-artifactory-oss-7.59.11-linux.tar.gz https://releases.jfrog.io/artifactory/bintray-artifactory/org/artifactory/oss/jfrog-artifactory-oss/ 2、解压下载下来的压缩包 tar zxf jfrog-artifactory-oss-7.59.11-linux.tar…

Excel数据格式:XLSX vs CSV 使用Python处理数据的优劣比较

Excel数据格式 [TOC](Excel数据格式)Excel数据格式&#xff1a;XLSX vs CSV 使用Python处理数据的优劣比较**XLSX格式****CSV格式****使用Python导出数据的推荐****总结** Excel数据格式&#xff1a;XLSX vs CSV 使用Python处理数据的优劣比较 在数据科学和编程领域&#xff0…

机器学习与模式识别大作业

import plane # import dense import numpy as np from sklearn.cluster import KMeans# 注意行列和xy的转换 应该只用行列 向上为行-1 向左为列-1 # 如果在xy图像里面会上下颠倒&#xff0c;左右不变 # 地图上有三个信息来源&#xff0c;一个是字符地图&#xff0c;一个是带有…

10 种语言文本准确渲染;Mac无需联网的本地聊天应用;多模态语言模型(MLM)基准测试的引擎;Yolo DotNet版本

✨ 1: Glyph-ByT5 10 种语言文本准确渲染&#xff0c;将文本渲染的准确性从提高到近 90% &#xff0c;同时还能实现段落渲染自动布局 Glyph-ByT5是一种定制的文本编码器&#xff0c;旨在实现准确的文字视觉渲染。其核心思想是通过细致的字形-文本配对数据集的微调&#xff0c…

VBA技术资料MF161:按需要显示特定工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

java spring-data-jpa 使用方法

Spring Data JPA 是 Spring 生态系统的一部分&#xff0c;它提供了对 JPA (Java Persistence API) 的抽象&#xff0c;简化了数据访问层的开发。 以下是使用 Spring Data JPA 的基本步骤和一些核心概念&#xff1a; 1. 添加依赖 在 Maven 项目的 pom.xml 文件中添加 Spring D…

uniapp实现内嵌其他网页的功能

一、用到的知识点 页面跳转页面间跳转&#xff0c;参数传递web-view使用 二、使用navigator 页面跳转。 navigator 组件类似HTML中的<a>组件&#xff0c;但只能跳转本地页面。目标页面必须在pages.json中注册。所以这么写是不行的&#xff1a; <navigator url&quo…