教你nginx跳转配置的四种方式


Posted in Servers onJuly 07, 2022

前言

最近工作用到了nginx,但是路由配置特殊,业务场景复杂,因此整理了集中nginx跳转的配置方式,如servername的正则,location的匹配顺序,rewrite和proxy的示例,相信总有一种满足你的需求。

一、配置server对应的域名

server name 为虚拟服务器的识别路径。因此不同的域名会通过请求头中的HOST字段,匹配到特定的server块,转发到对应的应用服务器中去。server_name匹配规则:后面可以跟多个域名,第1个是主域名

1.1、精确匹配

如下nginx配置

        listen       8080;
        server_name  test1.com;
        location / {
            return 200 "I am test1!\n";
        }
    }
    server {
        listen       8080;
        server_name  my.test.com;
        location / {
            return 200 "I am mytest!\n";
        }
    }

请求结果

curl http://my.test.com:8080 返回:I am mytest!
curl http://test1.com:8080 返回:I am test1!

1.2、正则表达式

以*通配符开始的最长字符串,如下示例

server {
        listen       8080;
        server_name  test1.*;
        location / {
            return 200 "I am test1!\n";
        }
    }

以*通配符结束的最长字符串

listen       8080;
        server_name  *.test.com;
        location / {
            return 200 "I am mytest!\n";
        }
    }

通配符名字只可以在名字的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔。所以,“my..com“都是非法的。

例如 :server_name my..com;

报以下错误:

nginx: [emerg] invalid server name or wildcard "my.*.com" on 0.0.0.0:8080

匹配正则表达式

server {
        listen     8080;
        server_name  ~^my(?<serno>.+).mydomain.com$;
        location / {
            return 200 $serno;
        }
    }

解释说明

  • ~: 表示大小写敏感的正则;
  • ^:匹配字符串的开始;
  • {.+}:换行符以外的任意自读重复一次活更多次;
  • (): 分组与取值;
  • :表示转义;
  • serno:设置提取的变量;
  • $:匹配字符串的结束;

请求结果

curl http://my02.mydomain.com:8080 返回:02% 
curl http://my03.mydomain.com:8080 返回:03%

server_name的配置顺序是怎样的呢?

按照如下顺序匹配:

  • 匹配顺序->
  • ->精确匹配
  • ->*在前的域名
  • ->*在后的域名
  • ->按文件中的顺序匹配
  • ->default server:第一个,listen指定default

二、配置location

2.1、Location 匹配规则:仅匹配URI,忽略参数

location [=|~|~*|^~] /uri/ { … }

匹配的正则符号如下:

  • = 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求
  • ~ 区分大小写匹配(可用正则表达式)
  • ~* 不区分大小写匹配(可用正则表达式)
  • !~ 区分大小写不匹配
  • !~* 不区分大小写不匹配
  • ^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式

2.2、举例

1、匹配任意请求
location [=|~|~*|^~] /uri/ { … }

2、不区分大小写匹配以js、php结尾的请求
location ~* .(js|php)$ { … }

3、区分大小写匹配以.txt结尾的请求
location ~ ^.+\.txt$

2.3、匹配顺序如下图

教你nginx跳转配置的四种方式

按照上面的规则配置了如下location

location = /documents {
    return 200 'configuration A'
}
location /documents {
    return 200 'configuration B'
}
location /documents/txt1 {
    return 200 'configuration C'
}
location ^~ /documents/ {
    return 200 'configuration D'
}
location ~* /documents/(\w+)$ {
    return 200 'configuration E'
}
location ~ /documents/$ {
    return 200 'configuration F'
}
  • curl http://test1.com:8080/documents,精确匹配返回 configuration A
  • curl http://test1.com:8080/documents/ ^~匹配上后不在匹配,返回 configuration D
  • curl http://test1.com:8080/documents/txt1 走到了正则匹配,不会走到/documents/txt1(正则没走完) 返回configuration E
  • curl http://test1.com:8080/documents/txt1/,返回configuration C,因为正则都不匹配

2.4、如何debug正则呢?

编译的时候加上 --with-debug选项,例如 ./configure --with-debug

conf文件加上要debug的host,debug_connection对应要debug的连接。

events {
    worker_connections  1024;
    debug_connection  192.168.1.3;
    debug_connection  127.0.0.1;
}

error.log查看debug日志,图中test location就是正则匹配的过程

教你nginx跳转配置的四种方式

三、配置rewrite

语法如下:

   指令语法:rewrite regex replacement[flag];
  默认值:none
  应用位置:server、location、if
  rewrite是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到replacement,结尾是flag标记.

flag标记 说明
last 本条规则匹配完成后继续向下匹配新的location URI规则
break 本条规则匹配完成后终止,不在匹配任务规则
redirect 返回302临时重定向
permanent 返回301永久重定向

3.1、重定向

return三种code,code url和url。

返回状态码:444表示关闭连接 301表示http1。0中永久重定向,302表示临时重定向,进制缓存。http1.1后,303表示临时重定向,允许改变方法,进制缓存,307表示临时重定向,不允许改变方法,禁止被缓存,308表示永久重定向,不允许改变方法。

返回code

location / {
    return 301 https://www.xxxx.com$request_uri;
}

通过$request_uri变量匹配所有的URI。

rewrite ^ https://www.xxxx.com$request_uri? permanent;

通过正则匹配所有的URI后再去掉开头第一个/(反斜线)。

rewrite ^/(.*)$ https://www.xxxx.com/$1;

与if指令结合

server {
        listen       80;
        server_name  test1.net test2.net;
        if ($host != 'test1.net' ) {
                rewrite ^/(.*)$ http://www.baidu.net/$1 permanent;
        }
}

3.2、如何查看rewrite日志

打开日志开关rewrite_log on;

可以配置到http,server,location和if上下文中

示例:curl http://test1.com:8080/first/2.txt

location /first {
        rewrite_log on;
        rewrite /first(.*) /second$1 last;
      }

效果图如下

教你nginx跳转配置的四种方式

四、配置 proxy

对上游服务使用http/https协议进行反向代理。proxy_pass后面跟url,可以仿造location,if in location和limit_except上下文中。 这个功能是默认编译到nginx中的。本文重点讨论http proxy。

url参数规则

  • url必须以http或者https开头,接下来是域名、ip、unix socket或者upstream名字,都可以就端口。后面是可选的uri

http示例

proxy_pass http://localhost:8000/uri/;

UNIX域套接字路径来定义示例

proxy_pass http://unix:/tmp/backend.socket:/uri/;

url中是否携带uri,结果也不一样,如果在proxy_pass后面的url加/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分给代理走。

目录结构如下

├── first

│   └── index.html

├── index.html

└── second

    └── index.html

nginx配置如下

server {
        listen       8081;
        server_name  my.test.com;
    }
    server {
        listen       8082;
        # 第一种情况
        location  /first {
            proxy_pass http://my.test.com:8081;
            proxy_set_header Host   $host;
            proxy_set_header X-Real-IP      $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # 第二种情况
        location  /first {
            proxy_pass http://my.test.com:8081/;
            proxy_set_header Host   $host;
            proxy_set_header X-Real-IP      $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

不带/,然后 curl http://127.0.0.1:8082/first/index.html 返回index html

带/,然后 curl http://127.0.0.1:8082/first/index.html 返回first index

  • Url参数中可以携带变量proxy_pass http://$host$uri;
  • 可以配合rewrite break语句
location /nameb/ { 
    rewrite /nameb/([^/]+) /test?nameb=$1 break;
    proxy_pass http://127.0.0.1:8801/; 
}

五、小结

配置nginx的路由,有多种方式,域名可以用server_name配置,uri可以用location配置,复杂的可以加rewrite配置修改请求。还有就是配置proxy代理,在代理中转发id等。

到此这篇关于nginx跳转配置的四种方式的文章就介绍到这了,更多相关nginx跳转配置内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Servers 相关文章推荐
Apache站点配置SSL强制跳转443
Mar 09 Servers
nginx常用命令放入shell脚本详解
Mar 31 Servers
nginx配置ssl实现https的方法示例
Mar 31 Servers
Nginx反向代理及负载均衡如何实现(基于linux)
Mar 31 Servers
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
May 27 Servers
Ubuntu Server 安装Tomcat并配置systemctl
Apr 28 Servers
Windows Server 2012 R2 磁盘分区教程
Apr 29 Servers
CentOS7安装MySQL8的超级详细教程(无坑!)
Jun 10 Servers
windows server 2016 域环境搭建的方法步骤(图文)
Jun 25 Servers
设置IIS Express并发数
Jul 07 Servers
Apache SkyWalking 监控 MySQL Server 实战解析
Sep 23 Servers
nginx sticky实现基于cookie负载均衡示例详解
Dec 24 Servers
kubernetes集群搭建Zabbix监控平台的详细过程
GPU服务器的多用户配置方法
Jul 07 #Servers
如何让你的Nginx支持分布式追踪详解
Zabbix对Kafka topic积压数据监控的解决方案
Zabbix对Kafka topic积压数据监控的问题(bug优化)
nginx静态资源的服务器配置方法
Jul 07 #Servers
Nginx配置使用详解
You might like
一个PHP分页类的代码
2011/05/18 PHP
php适配器模式介绍
2012/08/14 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
Python实现登录接口的示例代码
2017/07/21 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
对python实现合并两个排序链表的方法详解
2019/01/23 Python
Python datetime包函数简单介绍
2019/08/28 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
社团招新策划书
2014/02/04 职场文书
2014年公司工作总结
2014/11/22 职场文书
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers
使用refresh_token实现无感刷新页面
2022/04/26 Javascript
关于vue-router-link选择样式设置
2022/04/30 Vue.js