Nginx 重写功能(location / rewrite)

2023-11-13

一、nginx rewrite概述

1、概述

URL:就是一个具体路径/位置
URI:指的是一个拥有相同类型/特性的对象集合
​location是为了匹配访问的路径(URL)​

​if 做为分支判断,并且if分支,仅支持单分支​

​rewrite:对访问路径进行改写大分支:​

​1、改写的路径​

​在Nginx服务器上-改写路径​

​2、​改写的路径​

​在后端/其他服务器上-跳转

2、Rewrite跳转场景

URL看起来更规范、合理​
企业会将动态URL地址伪装成静态地址提供服务
网址换新域名后,让旧的访问跳转到新的域名上
服务端某些业务调整

3、Rewrite跳转实现

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

4、Rewrite实际场景

使用rewrite进行匹配跳转(防盗链)
使用if匹配全局变量后跳转
使用location匹配再跳转(匹配的访问 路径URL location可以匹配本地的重写以及跨服务器的跳转)
rewrite放在server{}, if{},location{}段中
(多个server模块 sever模块里包含location location包含if if里面包含rewrite)
location只对域名后边的除去传递参数外的字符串起作用
对域名或参数字符串
使用if全局变量匹配
使用proxy_pass反向代理

二、Nginx常见模块

http
http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这模块中。作用包括:文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。
server
server块,虚拟主机(虚拟服务器)。作用:使得Nginx服务器可以在同一台服务器上只要运行一组Nginx进程,就可以运行多个网站。
location
location块是server块的一个指令。作用:基于Nginx服务器接收到的请求字符串,虚拟主机名称(ip,域名)、url匹配,对特定请求进行处理。

三、常见的Nginx正则表达式

^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置

  • :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
  • :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
    ? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
    . :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
    \ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“$”则匹配“$”
    \d :匹配纯数字
    {n} :重复 n 次
    {n,} :重复 n 次或更多次
    {n,m} :重复 n 到 m 次
    [] :定义匹配的字符范围
    [c] :匹配单个字符 c
    [a-z] :匹配 a-z 小写字母的任意一个
    [a-zA-Z0-9] :匹配所有大小写字母或数字
    () :表达式的开始和结束位置
    | :或运算符

1、正则的优势

精确匹配,减少遍历的消耗
节省服务响应的资源消耗
提高用户体验感
提高服务器并发时、处理效率/性能

2、正则的作用

Nginx作为运维角度前段接受、想用客户请求的直接对服务器所以需要考虑到Nginx的执行效率(精确匹配-类比)、性能(资源消耗)、抗压能力(高并发时处理能力)、用户体验感(用户访问群体)

四、Rewrite语法

rewrite < regex > < replacement > [flag]
regex:正则表达式
replacement :跳转后的内容
flag:rewrite支持的flag标记

1、flag标记说明

在这里插入图片描述

2、last和break比较

在这里插入图片描述

3、rewrite执行顺序

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

五、location

1、location大致可以分为三类

精准匹配:location = / {…}
一般匹配:location / {…}
正则匹配:location ~ / {…}

2、location常用的匹配规则

= :进行普通字符精确匹配,也就是完全匹配。
^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。
~ :区分大小写的匹配。
~* :不区分大小写的匹配。
!~ :区分大小写的匹配取非。
!~* :不区分大小写的匹配取非。

3、location优先级排列说明

首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 *
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配

优先级结论
(location = 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (location /)

示例
1、 =为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。
location = / {}

2、 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,但若后面是正则表达式会和最长字符串优先匹配(最长匹配)
location / {}

3、匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条
location /documents/ {}

4、匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条
location /documents/abc {}

5、匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
location ^~ /images/ {}

6、匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location /images/ 处理,因为 的优先级更高,所以到达不了这一条正则。
location ~* .(gif|jpg|jpeg)$ {}

7、最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^ 和 存在
location /images/abc {}

8、匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条
location ~ /images/abc {}

9、匹配/images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高
location /images/abc/1.html {}

4、location 匹配顺序

首先看 优先级:精确>前缀>正则>一般>通用
优先级相同:正则看上下顺序,上面的优先;一般匹配看长度,最长匹配的优先
精确、前缀、正则、一般都没有匹配到,最后再看通用匹配

5、三个匹配规则定义

实际网站使用中,至少有三个匹配规则定义

直接匹配网站根
第一个必选规则直接匹配网站根
通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
可以是一个静态首页,也可以直接转发给后端应用服务器
location = / {
root html;
index index.html index.htm;
}
处理静态文件请求
第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
目录匹配
location ^~ /static/ {
root /webroot/static/;
}
后缀匹配
location ~* .(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
通用规则
第三个规则就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求
location / {
proxy_pass http://tomcat_server;
}
rewrite和location区别
从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

六、rewrite 示例

1、基于域名的跳转

公司旧域名www.liy.com有业务需求变更,需要使用新域名https://www.yongbu.top代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
#####将 http 重定向 https。
server {
listen 80;
server_name www.liy.com;
###return 301 https:// s e r v e r n a m e server_name servernamerequest_uri;
charset koi8-r;

    location / {
    if ($host = "www.dch.com") {            #$host为rewrite全局变量,代表请求主机头字段或主机名
            rewrite ^/(.*)$ https://www.yongbu.top/$1 permanent;  #$1为正则匹配的内容,即“域名/”之后的字符串
    }

}
}

server {
         #SSL 访问端口号为 443
    listen       443 ssl;
    server_name  www.liy.com;
    charset utf-8;
    access_log /var/log/nginx/dch.com.access.log;
      #证书文件名称
    ssl_certificate      /usr/local/nginx/conf/cert/7850872_www.yongbu.top.pem;
                                                               私钥文件名称
    ssl_certificate_key  /usr/local/nginx/conf/cert/7850872_www.yongbu.top.key;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;             #缓存有效期
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;         #安全链接可选的加密协议
     #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。        

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on; #使用服务器端的首选算法
root html;
index index.html index.htm;
}
}

2、 基于客户端 IP 访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.161.128访问正常。
编辑配置文件
vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.liy.com;
 return 301 https://$server_name$request_uri;
    charset koi8-r;
    set $rewrite true;            #设置rewrite变量值为true
    if ($remote_addr = '192.168.58.10'){    #当客户端IP为192.168.58.10时,将变量值设为false,不进行重写

    set $rewrite false;

}
#设置是否合法的IP标记
if (KaTeX parse error: Expected '}', got '#' at position 27: …rue) { #̲设置变量rewrite,变量值为boole值true
rewrite (.+) /weihu.html; #当rewrite值为真,则进行跳转
}
location = /weihu.html {
if (KaTeX parse error: Expected '}', got 'EOF' at end of input: … rewrite ^/(.*) https://www.yongbu.top/$1 permanent; ##http重定向到https

}

}
}



server {
    listen       443 ssl;
    server_name  www.yongbu.top;
    charset utf-8;
    access_log /var/log/nginx/liy.com.access.log;
    ssl_certificate      /usr/local/nginx/conf/cert/7850872_www.yongbu.top.pem;
    ssl_certificate_key  /usr/local/nginx/conf/cert/7850872_www.yongbu.top.key;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;
    root html;
    index  index.html index.htm;
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx 重写功能(location / rewrite) 的相关文章

  • uWSGI重启时停机

    每次当我有代码更新时重新启动服务器时 我都会遇到 uwsgi 问题 当我使用 sudo restart account 重新启动 uwsgi 时 停止和启动实例之间存在一个小间隙 导致停机并停止所有当前请求 当我尝试 sudo reload
  • ./manage.py 使用 https 运行服务器

    manage py 运行服务器 0 0 0 0 8000 我使用上面的行作为我从 github 借用的代码的一部分 https github com ribeiroit boh puppet https github com ribeiro
  • 通过 nginx 入口控制器进行基本身份验证

    我正在使用 nginx 入口控制器 https kubernetes github io ingress nginx deploy https kubernetes github io ingress nginx deploy 在 AWS
  • 在“git pull”我的 Django 项目后重新启动/重新加载 Gunicorn(通过 Upstart)的更好方法

    我正在寻找比sudo restart projectname每次我发出git pull origin master 它会下载我对 Django 项目的最新更改 这restart我相信该命令与 Upstart 有关 我用它来启动 停止我的 G
  • 上传大文件(几 GB)时,nginx 返回内部服务器错误

    我在 nginx 后面有一个 Artifactory 上传大于 4 GB 的文件失败 我相当确定这是 nginx 的错误 因为如果文件从本地主机上传 上传到本地主机 则不会出现问题 nginx 设置为client max body size
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • nginx 反向代理 websocket

    nginx 现在支持代理 websockets 但我无法找到任何有关如何在没有单独的情况下执行此操作的信息location应用于使用 websocket 的 URI 的块 我见过一些人推荐这种方法的一些变体 location proxy h
  • 使用 Nginx 或 Apache 来提供动态内容? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何正确链接 php-fpm 和 Nginx Docker 容器?

    我正在尝试链接 2 个单独的容器 nginx 最新 https registry hub docker com nginx php fpm https registry hub docker com php 问题是 php 脚本不起作用 也
  • Http POST 删除 URL 中的端口

    我有一个用 Django 构建的网络应用程序 我目前正在家里的路由器后面的笔记本电脑上运行它 我将路由器配置为将发送到特定端口的所有流量路由到该笔记本电脑 我将 Nginx 作为 Apache 的反向代理 使用 mod wsgi 来运行 D
  • 为什么 opcache 没有刷新?

    我用guzzlehttp guzzle封装在拉拉维尔 8 升级到后PHP 8 I get Symfony Component ErrorHandler Error FatalError Invalid opcode 117 2 0 in f
  • 常规请求期间 Django AJAX 请求未通过

    我有一个带有登录网页的 Django 站点 当提交页面上的登录表单时 它会执行登录视图 该视图会在其中运行一个需要很长时间处理 30秒左右 的函数 因此 为了在登录期间向客户端显示进度 一旦提交表单 登录页面上的 JS 函数就会开始向服务器
  • NGINX 上的 SSL 终止

    我已经购买了 SSL 证书 并在验证模数时正确地将其捆绑在一起 即https kb wisc edu middleware 4064 https kb wisc edu middleware 4064 那么哈希值是相同的 我已将证书和密钥移
  • Openresty 中的并发模型是什么?

    我很难理解 openresty 或 nginx 的并发模型 我读了Lua变量作用域 http wiki nginx org HttpLuaModule Lua Variable Scope 它解释了变量的生命周期 但它没有说明对它们的并发访
  • 如何修复 Nginx 自动 301 重定向到带有尾部斜杠的相同 URL?

    当我尝试将 Web 应用程序的子目录中的索引文件访问到相同的 URL 但附加了斜杠 时 Nginx 出现了不良行为 它正在重新路由请求 我有一个简单的 Web 应用程序 其中设置了一个根目录和其中的许多子目录 每个子目录中都有一个 inde
  • Nginx - Heroku Docker - 是否可以在 Heroku 上运行 Nginx 作为反向代理

    我试图弄清楚如何使用 Nginx 在 Heroku 应用程序上构建反向代理 问题是 Heroku 似乎每个应用程序只接受一个容器 但我的应用程序系统至少会使用三个容器 一个用于 Nginx 一个用于我的应用程序前端 一个用于我的业务逻辑服务
  • 抑制 nginx 访问被拒绝错误日志

    我在 nginx 中设置了一些规则来拒绝 IP 访问 这很有效 但对于来自被拒绝 IP 的每个请求 都会记录以下开头的错误 error 7325 0 5761 access forbidden by rule client 有没有办法抑制这
  • Nginx merge_slashes 重定向

    我在我的 Java 应用程序中使用 nginx 我的问题是 nginx 正在合并斜杠 我无法将我的网站重定向到正确的版本 例如 http goout cz cs koncerty praha 被合并到 http goout cz cs ko
  • 在 docker 中将 pgadmin 连接到 postgres

    我有一个docker compose与服务文件python nginx postgres and pgadmin services postgres image postgres 9 6 env file env volumes postg
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟

随机推荐

  • [yolov4]yolov4.weights

    版本 https github com AlexeyAB darknet 权重链接 yolov4 weights https 72k us file 26468910 439532813 提取密码 446792 yolov4 conv 13
  • [现代控制理论]5_系统的可控性_controllability

    现代控制理论 11 现代控制理论串讲 完结 pdf获取 现代控制理论 10 可观测性与分离原理 观测器与控制器 现代控制理论 9 状态观测器设计 龙伯格观测器 现代控制理论 8 5 线性控制器设计 轨迹跟踪simulink 现代控制理论 8
  • php正则表达式检查用户输入的格式是否正确

    比如说用户提交了一个电话 或者提交了一个邮箱 我们怎么才能知道它是不是正确的电话和邮箱格式 用正则表达式来匹配 PHP提供了一种强大的方法创建和匹配文本中的模式 可以创建一些规则来查找串的模式 这个规则就成为正则表达式 d d d d d
  • Redis常见面试题

    一 缓存处理流程 前台请求 后台先从缓存中取数据 取到直接返回结果 取不到时从数据库中取 数据库取到更新缓存 并返回结果 数据库也没取到 那直接返回空结果 二 缓存穿透 缓存穿透是指缓存和数据库中都没有的数据 而用户不断发起请求 如发起为i
  • Java反射1.类加载器概述与获取class文件对象的三种方式

    类加载器概述 一 类的加载 1 类的加载 当Java程序要使用某个类时 如果该类还未被加载到内存中 则系统会通过加载 连接 初始化三步来实现对这个类进行初始化 加载 就是指将类的class文件读入内存 并为之创建一个Class对象 任何类被
  • [Winfrom]Cefsharp配置与初始化

    摘要 在做客户端程序的时候 本来打算使用wpf的 但在内嵌cefsharp的时候 发现输入法有问题 所以使用了winform作为cefsharp的容器 系列文章 CefSharp 在同一窗口打开链接的方法 Winform CefSharp
  • 树的一些基础概念、堆和 python中heapq模块使用简介

    树定义 树是一种数据结构 比如 目录结构 树是由n个节点组成的集合 n 0 那么是一颗空树 n gt 0 那么存在一个节点为书的根节点 其他节点可分为m个子集 每个子集又为一棵子树 关于树的一些概念 根节点 例 A 叶子节点 不能分叉的节点
  • elementUI中图片上传upload组件,上传图片数据到后台

    结构
  • 【原创】谈谈服务雪崩、降级与熔断

    引言 首先 之所以谈这个话题呢 是发现现在很多人对微服务的设计缺乏认识 所以写一篇扫盲文 当然 考虑到目前大多微服务的文章都是口水文 烟哥争取将实现方式讲透 点清楚 让大家有所收获 OK 我要先说明一下 我有很长一段时间将服务降级和服务熔断
  • 谷粒商城 高级篇 (二) --------- ElasticSearch 检索

    目录 一 初步检索 1 cat 2 索引一个文档 保存 3 查询文档 4 更新文档 5 删除文档 索引 6 bulk 批量 API 7 样本测试数据 二 进阶检索 1 SearchAPI 2 Query DSL 3 Mapping 创建映射
  • 总结:整理 oracle异常错误处理

    5 1 异常处理概念 5 1 1 预定义的异常处理 5 1 2 非预定义的异常处理 5 1 3 用户自定义的异常处理 5 1 4 用户定义的异常处理 5 2 异常错误传播 5 2 1 在执行部分引发异常错误 5 2 2 在声明部分引发异常错
  • SGI STL 第二级空间配置器 内存池

    从内存池中取控件给free list 使用 是chunk alloc的工作 template
  • 程序设计的基本方法

    IPO模式 输入 处理 算法 是程序的灵魂 输出 问题的计算部分 程序编写步骤 分析问题 确定问题 设计算法 编写实现 调试测试 升级维护 编程技巧之流程图 我们写的程序都是有逻辑顺序的 即是有流程的 流程图的作用则是对这种逻辑顺序的一种描
  • jQuery选择器、特殊选择器、筛选器

    一 选择器 ul li class a 1 li li class a 2 li li class b 3 li li class c 4 li li class abc 5 li li li li li ul 1 获取页面中所有的ul标签
  • 颜色代码对照表

    各颜色代码 1 白色 FFFFFF 2 红色 FF0000 3 绿色 00FF00 4 蓝色 0000FF 5 牡丹红 FF00FF 6 青色 00FFFF 7 黄色 FFFF00 8 黑色 000000 9 海蓝 70DB93 10 巧克
  • 使用selenium实现自动登录

    from selenium import webdriver import time driver webdriver Chrome 打开登录页面 url为要打开的地址 driver get url 最大化浏览器 driver maximi
  • 域名系统几类服务器,域名系统

    域名系统 编辑 定义 域名系统 简称为DNS Domain Name System 是因特网使用的命名系统 用来便于人们使用的机器名字转换为IP地址 域名系统其实也称为名字系统 只是更明确地指明这种系统是用在因特网中 域名系统的主要特点是在
  • HTTP请求接口方法(POST/GET)

    private static string HttpPost string Url string postDataStr HttpWebRequest request HttpWebRequest WebRequest Create Url
  • 【Python】matplotlib画散点图,并根据目标列的类别来设置颜色区间(含源代码及参数解释)

    最近在进行绘图时 遇到了matplotlib画散点图 并根据目标列的类别来设置颜色区间的问题 但是实现的过程较为艰辛 文章目录 一 数据准备 二 第一次尝试 失败及其原因 2 1 失败 2 2 原因 三 第二次尝试 成功 四 总结 plt
  • Nginx 重写功能(location / rewrite)

    这里写自定义目录标题 一 nginx rewrite概述 1 概述 2 Rewrite跳转场景 3 Rewrite跳转实现 4 Rewrite实际场景 二 Nginx常见模块 三 常见的Nginx正则表达式 1 正则的优势 2 正则的作用