nginx--rewrite

功能

Nginx服务器利用ngx_http_rewrite_module 模块解析和处理理rewrite请求,此功能依靠PCRE(Perl Compatible Regular Expressions),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程度上提高网站的安全性

PCRE官方站点: http://www.pcre.org/

模块指令

http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

 if

使用

Nginx的if语法仅能用if做单次判断,不支持使用if else或者if elif这样的多重判断,可以配置在server或location块中进行配

语法

if (条件匹配) {
     action
}

正则表达式

=:比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false。
!=: 比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false。
~:表示在匹配过程中区分大小写字符,(可以通过正则表达式匹配),满足匹配条件为真,不满足为假。
!~:为区分大小写字符且匹配结果不匹配,不足满为真,满足为假。
~*: 表示在匹配过程中不区分大小写字符,(可以通过正则表达式匹配),满足匹配条件真,不满足为假。
!~*: 为不区分大小字符且匹配结果不匹配,满足为假,不满足为真。
-f 和 ! -f: 判断请求的文件是否存在和是否不存在
-d 和 ! -d: 判断请求的目录是否存在和是否不存在。
-x 和 ! -x: 判断文件是否可执行和是否不可执行。
-e 和 ! -e: 判断请求的文件或目录是否存在和是否不存在(包括文件、目录、软链接)。

 案例

文件存在
location /m78 {
    root /data/nginx/html/pc;
    default_type text/html;
    if (-f $request_filename){
       echo "look look look";
      }
     }  
  }
​ 
 文件不存在
  location /m78 {
    root /data/nginx/html/pc;
    default_type text/html;
    if (-f $request_filename){
       echo "look look look";
      }
     }  
  }

 

 判断网站的协议
  location /m78 {
    root /data/nginx/html/pc/www;
    default_type text/html;
    if ( $scheme = http ){
       echo "website is http";
     } 
    if ( $scheme = https ){
       echo "website is https";
      }
     }  
  }

​ 

 set

使用

自定义变量,定义的变量可以调用nginx内置变量,也可以调用值

语法

set $key $value

案例

 location /m78 {
    root /data/nginx/html/pc/www;
    default_type text/html;
    if ( $scheme = http ){
       echo "website is http";
     } 
    if ( $scheme = https ){
       echo "website is https";
      }
     }  
  

break

使用

退出操作,不在执行后面的指令,可以使用在server,location,if

案例

  location /m78 {
    root /data/nginx/html/pc/www;
    default_type text/html;
    set $name fxq;
    echo $name;
    break;
    set $port $server_port;
    echo $port;
     }  
  }

return

使用

return⽤用于完成对请求的处理,并直接向客户端返回响应状态码,可以指定重定向URL或者指定提示文本内容(特殊状态码403/500等),处于此指令所有配置不执行,可应用在server,if,location

语法

 return code; 返回给客户端指定的HTTP状态码

 return code (text); 返回给客户端的状态码及响应体内容,可以调用变量

 return code URL;返回给客户端的URL地址

案例

返回状态码
  location /m78 {
    root /data/nginx/html/pc/www;
    default_type text/html;
    if ( $scheme = http ) {
      return 555;  
      }
     }  
  }

 返回状态码并显示文本内容
  location /m78 {
    root /data/nginx/html/pc/www;
    default_type text/html;
    if ( $scheme = http ) {
      return 555 " website is no exist";  
      }
     }  
  }

  返回状态码并跳转
  location /m78 {
    root /data/nginx/html/pc/www;
    default_type text/html;
    if ( $scheme = http ) {
      return 301 http://xiaodi8.com/;  
      }
     }  
  }

rewrite_log

使用

设置是否开启记录ngx_http_rewrite_module模块日志记录到error_log日志文件当中,可以配置http、server、location或if当中,需要日志级别为notice

rewrite

URL和URI

URI(universal resource identifier):通用资源标识符,标识一个资源的路径,可以不带协议。
URL(uniform resource location):统一资源定位符,是用于在Internet中描述资源的字符串,是
URI的子集,主要包括传输协议(scheme)、主机(IP、端口号或者域名)和资源具体地址(目录和文件名)等三部分,⼀一般格式为 scheme://主机名[:端口号][/资源路径],如:http://www.a.com:8080/path/file/index.html就是⼀一个URL路径,URL必须带访问协议。
每个URL都是⼀个URI,但是URI不都是URL。

例如:
http://example.org:8080/path/to/resource.txt #URI/URL
ftp://example.org/resource.txt #URI/URL
/absolute/path/to/resource.txt #URI

使用

可以配置server、location、if

 参考:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

 语法

rewrite regex replacement [flag];
rewrite 正则匹配客户端请求 修改后的请求 标记位;

注意

如果在同⼀级配置块中存在多个rewrite规则,那么会自下⽽下逐个检查;被某条件规则替换完成后,会重新⼀轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制,如果替换后的URL是以http://或https://开头,则替换结果会直接以重向返回给客户端, 即永久重定向301

rewrite flag

使用

利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向,状态码302)、permanent(永久重定向,状态码301)、break和last。其中前两种是跳转型的flag,后两种是代理型,跳转型是指有客户端浏览器重新对新地址进行请求,代理型是在WEB服务器内部实现跳转的。

参数

redirect;临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302

permanent;重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301

last;重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在多location配置环境中使用

break;重写完成后停止对当前URL在当前location中后续的其它重写操作,而后直接将匹配结果返还给客户端即结束循环并返回数据给客户端,建议在多location配置环境中使用

 案例

permanent
  location /m78 {
     root /data/nginx/html/pc;
     default_type text/html;
     rewrite / http://xiaodi8.com permanent;
     }  
  } 

 redirect
  location /m78 {
     root /data/nginx/html/pc;
     default_type text/html;
     rewrite / http://xiaodi8.com redirect;
     }  
  }

break

1.结束当前location后续的write操作

2.break结束后会直接返回数据,不会跳出当前location再对URL进行和其他location匹配

[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
  listen 80;
  listen       443 ssl;
  ssl_certificate  /apps/nginx/certs/www.fxq.com.crt;
  ssl_certificate_key /apps/nginx/certs/www.fxq.com.key;
  ssl_session_cache shared:sslcache:20m;
  ssl_session_timeout 10m;
  server_name www.fxq.com;
  location / {
     root /data/nginx/html/pc;
     index index.html;
  }
  location = /favicon.ico {
     root /data/nginx/html/pc;
  }
  location /break {
     #return 666 "break";
     root /data/nginx;
     index index.html;
     rewrite ^/break/(.*) /test1/$1 break;#break匹配成功后不再向下匹配,也不会跳转到其他的location,即直接结束匹配并给客户端返回结果数据。
     rewrite ^/break/(.*) /test1/$2 break;#break不会匹配后面的rewrite规则也不匹配其location
      }
  location  /test1 {
     #return 999 "test1";
     root /data/nginx;
     index index.html;
    }
   location /test2 {
     #return 777;
     root /data/nginx;
     index index.html;
    }
  }

last

1.结束当前location后续的write操作

2.当前location的write结束后会将产生的新的URL跳出当前loction进行与其他location的匹配

[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf 
server {
  listen 80;
  listen       443 ssl;
  ssl_certificate  /apps/nginx/certs/www.fxq.com.crt;
  ssl_certificate_key /apps/nginx/certs/www.fxq.com.key;
  ssl_session_cache shared:sslcache:20m;
  ssl_session_timeout 10m;
  server_name www.fxq.com;
  location / {
     root /data/nginx/html/pc;
     index index.html;
  }
  location = /favicon.ico {
     root /data/nginx/html/pc;
  }
  location /break {
     #return 666 "break";
     root /data/nginx;
     index index.html;
     rewrite ^/break/(.*) /test1/$1 last;
     rewrite ^/break/(.*) /test1/$2 last;
      }
  location  /test1 {
     #return 999 "test1";
     root /data/nginx;
     index index.html;
    }
  location  /test2 {
     #return 777;
     root /data/nginx;
     index index.html;
    }
  }

自动跳转http
[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf 
server {
  listen 80;
  listen       443 ssl;
  ssl_certificate  /apps/nginx/certs/www.fxq.com.crt;
  ssl_certificate_key /apps/nginx/certs/www.fxq.com.key;
  ssl_session_cache shared:sslcache:20m;
  ssl_session_timeout 10m;
  server_name www.fxq.com;
  location / {
     root /data/nginx/html/pc;
     index index.html;
     if ( $scheme = http ) { #未加条件判断,会导致死循环
       rewrite / https://www.fxq.com/;
    }
  }
  location = /favicon.ico {
     root /data/nginx/html/pc;
  }
  }

 判断文件是否存在
[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf 
server {
  listen 80;
  listen       443 ssl;
  ssl_certificate  /apps/nginx/certs/www.fxq.com.crt;
  ssl_certificate_key /apps/nginx/certs/www.fxq.com.key;
  ssl_session_cache shared:sslcache:20m;
  ssl_session_timeout 10m;
  server_name www.fxq.com;
  location / {
     root /data/nginx/html/pc;
     index index.html;
     if ( !-f $request_filename ) {
       rewrite (.*) https://www.fxq.com/;
    }
  }
  location = /favicon.ico {
     root /data/nginx/html/pc;
  }
  }   

文件绝对安全

chattr +i 文件

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

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

相关文章

微搭低代码入门04数据模型

目录 1 创建数据模型2 一对多3 通用选项集4 API总结 上一篇我们介绍了页面管理,页面是盛放组件的容器,组件在配置属性的时候需要进行数据绑定。数据是通过创建数据模型来进行存储,本篇我们介绍一下数据模型的相关操作。 1 创建数据模型 微搭…

AnaTraf网络流量分析仪:网络性能监测与诊断的利器

背景 在当今数字化时代,网络性能监测与诊断(Network Performance Monitoring and Diagnosis, NPMD)成为了企业和组织管理网络的重要一环。为了帮助企业更好地实现网络性能的监控和故障排除,AnaTraf的网络流量分析仪应运而生。 AnaTraf网络流量分析仪是…

数据存储-SQLite

一般使用到数据库存储,涉及到的数据量都较大,采用文件存储也能完成,但是文件操作复杂,效率低,大量结构化数据通常采用关系型数据库存储较为合适。Android中已经嵌入了轻量级的关系型数据库SQLite,直接按照数…

数据库复习2

试述SQL的特点 有两个关系 S(A,B,C, D)和 T(C,D,E,F),写出与下列查询等价的 SQL 表达式: 用SQL语句建立第2章习题6中的4个表;针对建立的4个表用SQL完成第2章习题6中的查询 针对习题4中的4个表试用SQL完成以下各项操作 (1)找出所有供应商的姓名和所在城市…

【高阶数据结构(一)】并查集详解

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:高阶数据结构专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多Go语言知识   🔝🔝 高阶数据结构 1. 前言2. 并查集…

上传文件到 linux

一、mac 法一:scp 先进入mac的 Node_exporter文件(要上传的文件)目录下 输入scp -P 端口号 文件名 rootIP:/存放路径 scp -P 22 node_exporter-1.8.0.linux-amd64.tar.gz root192.***.2:/root 法二、 rz mac 安装 lrzsz,然后…

社交媒体数据恢复:batchat

蝙蝠聊天数据恢复方法 1. 数据恢复的基本原理 蝙蝠聊天的聊天记录一旦删除是不能够恢复的。这是因为蝙蝠聊天的聊天记录是保存于本地的,一旦删除,就如同在电脑或手机上删除文件一样,数据不会存储在服务器端。这意味着,如果你删除…

如何远程连接办公室电脑?

远程办公成为了现代工作生活的一部分,特别是在面对突如其来的疫情时,远程连接办公室电脑成为了一种常见的解决方案。通过远程连接,员工可以在不在办公室的情况下,直接访问办公室电脑上的文件和应用程序,实现远程协作和…

UE5(射线检测)学习笔记

这一篇会讲解射线检测点击事件、离开悬停、进入悬停事件的检测,以及关闭射线检测的事件,和射线检测蓝图的基础讲解。 创建一个简单的第三人称模板 创建一个射线检测的文件夹RadiationInspection,并且右键蓝图-场景组件-命名为BPC_Radiation…

阅读欣赏推荐之(六)——纪录片《阿基米德的秘密》

阿基米德是古希腊物理学家、数学家,静力学和流体静力学的奠基人。有人评价说除了伟大的牛顿和伟大的爱因斯坦,再没有一个人像阿基米德那样为人类的进步做出过这样大的贡献。即使是牛顿和爱因斯坦,也都曾从他身上汲取过智慧和灵感。他是“理论…

[暂未实现]APP签名不同保留数据覆盖安装记录

APP签名不同无法直接覆盖安装 使用adb可以卸载应用同时保留数据,但签名不同也无法覆盖安装(安装原来签名的应用打开和卸载前一样) 使用adb导出应用数据(QQ)db文件只有1kb,显然此方法也行不通

FreeBSD下安装Linux兼容系统Ubuntu

FreeBSD有个很神奇的功能,就是跟Linux二进制兼容,也就是可以直接运行linux的bin文件。还有个更神奇的功能,就是能运行出一套Linux系统,完全是linux的用户,linux的目录系统,而且还可以选是Centos系统还是Ubu…

在离线环境中将运行 Oracle DB 12c 的 CentOS 7.5 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文只是说明如何在 CentOS 7.5 上准备 Oracle DB 12c 验证环境,而将该环境升级并迁移至 RHEL 7.9 的操作过程请参见:《在离线环境中将 CentOS 7.5 原地升级并迁移至 RHEL 7.9》一文。 另外&#xff…

DEM(高程)数据下载及计算可见性

数据下载 下载链接: 地理空间数据云 (gscloud.cn) 数据部分介绍 ASTER是美国宇航局Terra航天器(1999年发射)上的五台仪器之一,在日本为经济产业省(METI)建造。美国/日本联合科学团队负责仪器设计、校准和数据验证。 高级星载热发射和反射辐射计(ASTER)全球数字高程…

Android BINDER是干嘛的?

1.系统架构 2.binder 源码位置: 与LINUX传统IPC对比

【c++设计模式15】结构型7:代理模式(Proxy Pattern)

【c设计模式15】结构型7:代理模式(Proxy Pattern) 一、定义二、适用场景三、过程四、代理模式类图五、C示例代码六、使用注意事项七、结论 类型序号设计模式描述结构型1适配器模式(Adapter Pattern)它用于在不修改已有…

一次完整的 http 请求是怎样的?

一次完整的 http 请求是怎样的? 💖The Begin💖点点关注,收藏不迷路💖 域名解析 --> 发起 TCP 的 3 次握手 --> 建立 TCP 连接后发起 http 请求 --> 服务器响应 http 请求,浏览器得到 html 代码 --…

Activating More Pixels in Image Super-Resolution Transformer

cvpr2023https://github.com/XPixelGroup/HAT?tabreadme-ov-file问题引入: – 现在的transformer based的SR模型“感受野”不够; – 分析:原本认为transformer-based的方法优于CNN-based的方法是因为可以利用更加long-range的信息&#xff0…

MySql数据库(概念篇)

数据库概念 什么是数据库 数据库见名之意,就是用来存储数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 没接触数据库之前,一般都是将数据存储在文件中。比如execl文件,word文件中。但是…

基于 Dockerfile 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 镜像创建 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 2.4 生成镜像 2.5 创建 Nginx 镜像的容器 2.6 验证nginx 3、Mysql 镜像创建 3.1 建立工作目录并上传相关安装包 3.2 编写…