Nginx的rewrite重写跳转和location匹配

2023-11-01

目录

常用的Nginx 正则表达式

location大致可以分为三类

location 常用的匹配规制

location优先级

location示例说明

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

第一个必选规则

第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

第三个规则就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器

rewrite概述

rewrite跳转实现:

rewrite 示例:

基于域名的跳转

基于客户端 IP 访问跳转

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

 基于参数匹配的跳转

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

 基于最普通一条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] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符


从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

location大致可以分为三类

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

location 常用的匹配规制

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

location优先级

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

location示例说明

(1)location = / {}

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

(2)location / {}

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

(3)location /documents/ {}

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

(4)location /documents/abc {}

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

(5)location ^~ /images/ {}

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

(6)location ~* \.(gif|jpg|jpeg)$ {}

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

(7)location /images/abc {}

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

(8)location ~ /images/abc {}

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

(9)location /images/abc/1.html {}

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

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

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







第一个必选规则

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
这里是直接转发给后端应用服务器了,也可以是一个静态首页
location = / {
proxy_pass http://tomcat_server/;
}







第二个必选规则是处理静态文件请求,这是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概述

掐头去尾取中间,中间的部分就是要rewrite要重写的部分


rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上,某网页发生改变需要跳转到新的页面,网站防盗链等等需求

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的出去传递的参数外的字符串起作用
例如http://www.kgc.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写

在这里插入图片描述

rewrite跳转实现:


Nginx:通过ngx_http_rewrite_module 模块支持URL重写,支持if条件判断,但不支持else
跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后nginx将放回500错误
PCRE支持:perl兼容正则表达式的语法规则匹配
重写模块set指令:创建新的变量并设其值

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

语法rewrite [flga]
regex:表示正则表达式规则
replacement :表示跳转后的内容
flag:表示rewrite支持flag标记

rewrite 示例:

基于域名的跳转

例:旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

vim /usr/local/nginx/conf/nginx.conf


         server {
         listen       80;
         server_name  www.kgc.com;     #域名修改

        charset utf-8;

        access_log  /var/log/nginx/www.kgc.com-access.log ;   #日志修改

        location / {
            if ($host = 'www.kgc.com'){                   #$host为rewrite全局变量,代表请求主机头字段或主机名
               rewrite ^/(.*)$ http://www.benet.com/$1 permanent;   #$1为正则匹配的内容,即域名后边的字符串
        }

             root   html;
            index  index.html index.htm;
        }

         location /status {
            stub_status on;
            access_log off;
        }






[root@www log]# cd /var/log/   
[root@www log]# mkdir nginx       #手动创建一个日志目录


echo "192.168.159.101 www.kgc.com www.benet.com" >> /etc/hosts
systemctl restart nginx

 

基于客户端 IP 访问跳转

要求所有 IP 访问任何内容都显示一个固定维护页面,只有IP :192.168.159.101访问正常。

server {
         listen       80;
         server_name  www.kgc.com;                        #域名修改	

        charset utf-8;

        access_log  /var/log/nginx/www.kgc.com-access.log ;   #日志修改
        
        #设置是否合法的IP标记
        set $rewrite true;              #设置变量$rewrite,变量值为boole值true

            if ($remote_addr = "192.168.159.101"){     #当客户端IP为192.168.159.101时,将变量值设为false,不进行重写

           set $rewrite false;

          }

         if ($rewrite = true){               #当变量值为true时,进行重写
             rewrite (.+) /weihu.html;      #重写在访问IP后边插入/weihu.html,例如192.168.159.102/weihu.html
             }
            location = /weihu.html {
            root /var/www/html;              #网页返回/var/www/html/weihu.html的内容
                                        }

            location / {
            root   html;
            index  index.html index.htm;
              }
            }




mkdir -p /var/www/html/   -p检查目录在不在 不在就创建


[root@www log]# cd /var/www/html/
[root@www html]# vim weihu.html
[root@www html]# vim weihu.html

<h1>ciao!</h1>




systemctl restart nginx
只有 IP 为 192.168.159.101 客户端能正常访问,其它地址客户端都是维护页面

不同客户端 访问结果 

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

例如现在访问的是 http://bbs.kgc.com/post 现在需要将这个域名下面的发帖都跳转到 http://www.kgc.com/bbs/post,注意保持域名跳转 后的参数不变。

server {
         listen       80;
         server_name  bbs.kgc.com;              #域名修改	

        charset utf-8;

        access_log  /var/log/nginx/kgc.com-access.log ;

        location /post {
                 rewrite (.+) http://www.kgc.com/bbs$1 permanent;  #$1为位置变量,代表/post
              }

            location / {
            root   html;
            index  index.html index.htm;
              }
            }


[root@www post]#  mkdir -p  /usr/local/nginx/html/bbs/post
[root@www post]# cd  /usr/local/nginx/html/bbs/post
[root@www post]# ls
1.html  index.html
[root@www post]# vim 1.html

ciao


echo "192.168.159.101 www.bbs.com"  >> /etc/hosts
echo "192.168.159.101 www.kgc.com"  >> /etc/hosts
systemctl restart nginx

 

 基于参数匹配的跳转

server {
                listen       80;
         server_name  www.kgc.com;  #改域名

        charset utf-8;

        access_log  /var/log/nginx/www.kgc.com.access.log ;


       location ~ ^/100\-(100|200)\-(\d)+\.html$ {
                rewrite (.+) http://www.kgc.com permanent;
        }
        location / {
            root   html;
            index  index.html index.htm;
          }



[root@www post]# nginx -t

[root@www post]# systemctl restart nginx.service 

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

  server {
                listen       80;
         server_name  www.kgc.com;

        charset utf-8;

        access_log  /var/log/nginx/www.kgc.com.access.log ;
        location ~* ^/upload.*\.php$ {
                rewrite (.+) http://www.kgc.com permanent;
        }

       location / {
            root   html;
            index  index.html index.htm;
        }

[root@www post]# nginx -t

[root@www post]# systemctl restart nginx.service 

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

访问一个具体的页面 如  http://www.kgc.com/abc/123.html   跳转到首页

 [root@www post]# vim /usr/local/nginx/conf/nginx.conf
server {
                listen       80;
         server_name  www.kgc.com;

        charset utf-8;

        access_log  /var/log/nginx/www.kgc.com.access.log ;
         location ~* ^/abc/123.html {
                rewrite (.+) http://www.kgc.com permanent;
        }


       location / {
            root   html;
            index  index.html index.htm;
        }


[root@www post]# nginx -t


[root@www post]# systemctl restart nginx.service 

 

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

Nginx的rewrite重写跳转和location匹配 的相关文章

  • Node + Express + Nginx 未设置 Cookie

    我有一个使用 Express 的 Node 应用程序 我尝试为我的客户端设置 cookie 它在本地环境 http 上运行良好 但是一旦我投入生产 https 我就很好地收到了cookie 我可以在响应中看到它 但它没有设置 任何想法 Ng
  • 如何将多个域路由到多个节点应用程序?

    我习惯了典型的 Lamp Web 托管环境 您只需单击 cpanel 中的几个按钮 您的域就会被分区并映射到 htdocs 中的文件夹 我经常使用 Node js 但做同样的事情似乎并不那么简单 如果我有多个节点应用程序 并且我想将doma
  • kubernetes 集群中 django 应用程序的 Nginx 配置

    我在为部署在 kubernetes 中的 django 应用程序创建 nginx 配置文件时遇到困难 Nginx 和 app 是同一集群中的两个独立容器 据我了解 容器可以通过 127 0 0 1 XX 和主机名相互通信 我为此使用 min
  • nginx 反向代理 websocket

    nginx 现在支持代理 websockets 但我无法找到任何有关如何在没有单独的情况下执行此操作的信息location应用于使用 websocket 的 URI 的块 我见过一些人推荐这种方法的一些变体 location proxy h
  • nginx 匹配位置中的特定单词

    我在匹配 nginx request body 变量中的特定单词时遇到问题 如果正文请求中有特殊单词 我想代理传递 所以我的方法是这样的 location php if request body proxy pass http test p
  • nginx 反向代理到 apache-wordpress 可以工作,但到外部 url 的 proxy_pass 失败

    我有一个针对 apache wordpress 的 nginx 反向代理设置 效果很好 但是 根据位置需要重定向到失败的外部 url 请检查以下配置 这是一个有效的设置吗 https platform com https platform
  • nginx 和 uwsgi 非常大的文件上传(>3Gb)

    也许有人知道该怎么做 我正在尝试上传大于 3Gb 的文件 没问题 如果我使用以下配置上传高达 2Gb 的文件 Nginx client max body size 5g client body in file only clean clie
  • 如何使用gunicorn和bokeh服务配置Nginx

    我想提供一个 Flask 应用程序 该应用程序使用本地网络服务器上的嵌入式散景服务 为了说明这一点 我使用了一个例子散景服务示例 https github com bokeh bokeh blob 0 12 11 examples howt
  • 在 docker 中将 pgadmin 连接到 postgres

    我有一个docker compose与服务文件python nginx postgres and pgadmin services postgres image postgres 9 6 env file env volumes postg
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • Logrotate - nginx 日志不在 docker 容器内旋转

    我有一个运行 nginx 的 docker 容器 它正在将日志写入 var log nginxLogrotate 安装在 docker 容器中 并且 nginx 的 logrotate 配置文件已正确设置 尽管如此 logrotate 仍不
  • 上游太大 - nginx + codeigniter

    我从 Nginx 收到此错误 但似乎无法弄清楚 我正在使用 codeigniter 并使用数据库进行会话 所以我想知道标题怎么会太大 有没有办法检查标题是什么 或者看看我能做些什么来修复这个错误 如果您需要我提供任何conf文件或其他文件
  • 使用 DigitalOcean 在 Kubernetes 集群上为我的 Nginx-Ingress 生成通配符证书

    我遵循了这个 DigitalOcean 指南https www digitalocean com community tutorials how to set up an nginx ingress with cert manager on
  • Flask 或 Pyramid 中的简单网络 UDP 监听

    我需要创建一个 Web 应用程序来显示通过定期传入 UDP 数据包提供的数据 该站点可能位于 Flask 可能是 Pyramid 中 部署在 Nginx 下 如何创建一个非常简单的后台任务 基本上只是 socket recv 来侦听任何传入
  • 使用代理协议的 kubernetes nginx 入口最终出现损坏的标头

    我尝试使用代理协议在 google 容器上设置 nginx 入口 nodeport 以便可以将真实 IP 转发到后端服务 但最终导致标头损坏 2017 02 05 13 48 52 error 18 18 2 broken header H
  • 是否可以使用 nginx 合并两个 json 响应?

    我有一个现有的快速端点 如下所示 app get route id async req res gt try const id req params id const result await dbFn id res send result
  • uWSGI 皇帝权限被拒绝,除非 root

    我尝试使用二进制文件本身的标志 uid www data gid www data 并将其设置在我的配置中 uid www data gid www data 但套接字总是由我正在使用的帐户生成 因此我从 nginx 收到权限被拒绝的错误
  • 为什么将域连接到“Shopify”需要 CNAME 和 A 记录?

    为什么将域连接到 Shopify 需要CNAME and ARecord ref https help shopify com en manual domains add a domain using existing domains co
  • uwsgi协议比http协议快吗?

    我正在尝试部署 django 应用程序的各种设置 我的第一选择是使用带有 mod wsgi 的简单 apache 服务器 我之前已经实现了该服务器供私人使用 由于当前的部署是供公众使用的 因此我正在考虑各种选择 根据网上提供的信息 使用 n
  • 禁用 Kubernetes NGINX 入口的 SSL 重定向

    默认情况下 在 Kubernetes NGINX 入口中启用 SSL 重定向 如何禁用此功能 目前的实施如下 apiVersion extensions v1beta1 kind Ingress metadata name project

随机推荐

  • LeetCode-343.整数拆分、记忆化递归

    给定一个正整数 n 将其拆分为至少两个正整数的和 并使这些整数的乘积最大化 返回你可以获得的最大乘积 示例 1 输入 2 输出 1 解释 2 1 1 1 1 1 力扣 LeetCode 第343题 题目分析 暴力枚举 一个正整数 n 拆分成
  • 【图像处理】工业相机原理详述

    工业相机是机器视觉系统中的一个关键组件 其最本质的功能就是将光信号转变成有序的电信号 选择合适的相机也是机器视觉系统设计中的重要环节 相机的选择不仅直接决定所采集到的图像分辨率 图像质量等 同时也与整个系统的运行模式直接相关 欢迎关注微信公
  • jpa多表查询的简单方法——自写sql支持limit子句

    1 思路 使用自写sql进行查询不需要在实体上添加 ManyToOne等注解 清晰简单并且容易实现 由于本例中要使用到limit子句进行分页 而hql不支持limit 因此使用原生sql不能直接使用new语句 需将返回值设为Object 或
  • styleGAN记录

    前言 最近需要看一些gan相关的工作 所以写个博客记录一下开个坑 由于也不知道啥时候能写完 这里看到一篇写的还可以的博文 着急的朋友可以移步 从零带你入门stylegan stylegan3的技术细节 styleGAN v1 styleGA
  • 微软高级工程师:珍惜生命,远离C++

    众所周知 C 很难 有人会语重心长告诫后来者 珍惜生命 远离C 但仍然有小伙伴前赴后继挑战 当然是因为它有着独特的优势 C 是一种高效 通用的编程语言 广泛应用于系统开发 嵌入式 游戏开发 高性能计算和金融技术等领域 那C 学多久才算精通呢
  • C++ 纯虚函数和虚函数的区别

    在 C 中 虚函数 Virtual Function 和纯虚函数 Pure Virtual Function 都是用于实现多态性的机制 但它们之间有一些关键的不同 虚函数 Virtual Function 定义 在基类中使用 virtual
  • React路由基础

    React路由 路由使用步骤 编程式导航 路由使用步骤 安装 npm i react router dom D 引入并使用 1 引入路由 import BrowserRouter as Router Route Link from reac
  • 计算机网络实验路由器配置

    路由器配置实验 实验目的及要求 认识路由器的端口 型号 2 掌握路由器的路由配置 理解网络互联的基本原理 实验环境 Packet Tracer V6 实验内容 路由器接口的配置 静态路由配置 默认路由配置 动态路由配置 实验步骤 1 路由器
  • React 函数组件和类组件的优缺点

    React 函数组件和类组件的优缺点 React中的组件可以分为函数组件和类组件 它们各自有一些优缺点 下面是一些常见的观点 函数组件的优点 定义和使用较简单和直观 只需要一个函数即可 对于简单的组件 可以使用函数组件来提高性能和简化开发
  • Arena仿真-基于超市排队的建模分析

    文章目录 Arena仿真作业 一 问题介绍 1 1 模型假设 1 2 优化目标 1 3 约束条件 二 模块设计 2 1 Create模块 2 2 Decide模块 2 3 Assign模块 2 4 Process模块 2 5 Dispose
  • element UI 穿梭框按钮样式修改

    利用Element UI 修改穿梭框的按钮样式 html部分
  • filter 方法常用过滤条件

    encoding utf 8 from sqlalchemy import create engine Column Integer String Float func and or from sqlalchemy ext declarat
  • Java Arrays.sort()自定义排序方法

    Java Arrays sort可以对很多数据类型进行排序 但是当需要对一个比较特殊的数组进行排序的时候 比如一个二维数组 我们要以每组的第一个数大小来排序 则需要我们自己定义一个比较方法 先看看源码 public static
  • 重学Java(四):操作符

    之前我写了一篇 重学Java 四 对象 引用 堆 栈 堆栈 本以为凭借自己8年的Java编程经验足够把这些 吃人 的Java名词解释清楚了 但有网友不以为然 在文章底部评论说 老哥 你真的有8年java开发经验么 告诉我 为什么要用三个句号
  • SylixOS系统简介

    SylixOS是一款嵌入式硬实时操作系统 同其类似的操作系统 全球比较知名的还有VxWorks 主要应用于航空航天 军事与工业自动化领域 RTEMS 起源于美国国防部导弹与火箭控制实时系统 ThreadX 主要应用于航空航天与数码通讯 等
  • 正确理解MySQL的MVCC及实现原理

    MVCC多版本并发控制 目录 MVCC多版本并发控制 前提概要 什么是MVCC 什么是当前读和快照读 当前读 快照读和MVCC的关系 MVCC的实现原理 隐式字段 undo日志 Read View 读视图 整体流程 MVCC相关问题 RR是
  • GlobalCorsConfig跨域文件

    package com config import org springframework context annotation Bean import org springframework context annotation Conf
  • Zabbix的基本使用

    文章目录 一 认识Zabbix 1 简介 2 功能 3 架构 4 数据流 二 项目 1 软件安装和环境部署 2 Zabbix工具的使用 1 创建被控主机 2 中文乱码修复 3 自动发现主机 4 自动注册主机 3 zabbix的API调用 4
  • Pandas中DataFrame的基本操作(增删)

    这是一篇最基础的Pandas用法总结 也方便自己日后进行复习与查询 这一次我们来总结一下Pandas中的一些增删改基本操作 df pd DataFrame F 90 88 85 M 75 97 74 F 82 73 91 M 93 99 9
  • Nginx的rewrite重写跳转和location匹配

    目录 常用的Nginx 正则表达式 location大致可以分为三类 location 常用的匹配规制 location优先级 location示例说明 实际网站使用中 至少有三个匹配规则定义 第一个必选规则 第二个必选规则是处理静态文件请