IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> nginx那点事儿——nginx中的匹配规则 -> 正文阅读

[系统运维]nginx那点事儿——nginx中的匹配规则


前言

nginx中强大的功能,,如rewrite、proxy_pass都离不开他的匹配规则。搞懂nginx,学会高级的nginx用法,各种匹配优先级、匹配语法一定要知道


一. nginx location

1.语法规则和优先级

location [=|~|~*|!~|!~*|^~] /uri/ {

  ...

} 

  =     >   ^~   >   ~|~*|!~|!*~**    >    /

精确匹配 > 字符开头 > 正则匹配 > 通配
server {

  listen 192.168.93.136;

  root /abcd;

  index  index.html;

location = / { index a.html; }

location ~ / { index b.html; }

location   / { index c.html; }

}

# 测试页面 根据页面的不同内容来观察优先级 

2.匹配顺序

除了优先级以外,还有一种少见的根据优先匹配顺序来决定使用哪个匹配,举个例子

在这里插入图片描述

图示:根据不同的匹配转发到不同的tomcat应用,都是用的~正则匹配

此时有一个url,如:http://ip:port/gwaf/report,可以看到,这个url同时满足两个匹配,那么该请求是转发到server2,还是server3呢。

答案是server2。同级别匹配规则,走先匹配到的匹配规则,从配置文件角度来看,就是从上到下的顺序,这里也就是匹配到了 ~ /(console|report),所以转发到server2。

那么就会出现一个问题,如若这个url是请求的server3里面的接口,应该转发到server3处理的,但却转发到server2,这时nginx会返回404,因为server2处理不了这个接口。这里有两种方法:可以尝试将~ /gwaf匹配写到~ /(console|report) 匹配的前面,让~ /gwaf 优先匹配,转发到server3。或者使用^~ /gwaf ,使用开头匹配增加匹配优先级。

二. nginx rewrite

rewrite 将用户访问的url 重定向到一个新的url

下面通过几个rewrite匹配案例来看一下

案例1:rewrite url实现跳转

当访问http://192.168.93.136/aaa/a/1.html 时,重定向至http://192.168.93.136/ccc/bbb/1.html

mkdir -p /usr/share/nginx/html/ccc/bbb

mkdir -p /usr/share/nginx/html/aaa/a

vim /usr/share/nginx/html/aaa/a/1.html

vim /usr/share/nginx/html/ccc/bbb/1.html

vim /etc/nginx/conf.d/default.conf

  location /aaa {

    rewrite .* /ccc/bbb/1.html permanent;   # url含有/aaa就会被重定向到 /ccc/bbb/1.html

    }

测试页面 http://192.168.100.10/aaa/a/1.html 访问的url中含有"/aaa"字段就可以

permanent参数:

如果用了permanent 会直接显示新的url 新的网页内容,如果不使用 还是显示原来的url但是页面内容还是会显示转发后的。

以下匹配方法是否可行:

location  = /aaa   http://192.168.100.10/aaa/123.html是否可行

不可行。因为需要完全匹配

location ~ /aaa   http://192.168.100.10/aaa/123.html是否可行

可行。因为部分匹配即可

location ^~ /aaa   http://192.168.100.10/aaa/123.html是否可行

可行。因为部分匹配即可

案例2:rewrite中使用正则

将http://192.168.93.136/2017/a/1.html 换http://192.168.93.136/2018/a/2.html

mkdir -p 2018/a/

echo '2018' 2018/a/1.html

mkdir -p 2019/a

echo '2019' 2019/a/2.html

vim /etc/nginx/conf.d/default.conf

  location /2018{

    rewrite ^/2018/(.*)$ /2019/$1 permanent; # $1是指前面()里的内容,和shell的正则一样

    }

    访问测试 http://192.168.93.136/2018/a/1.html

案例3:主机名重定向

将http://liang.com 换http://kong.com

vim /etc/nginx/conf.d/default.conf

  if ( $host ~* liang.com ) { # $host nginx内置变量

  rewrite .*  http://kong.com permanent;

  }

  访问测试 访问liang.com

案例4:域名重定向

将http://web.liang.com/a/1.html 换成 http://kong.com/a/1.html

建立两个虚拟主机 分别进行域名解析 创建2个主机的主页内容

echo 'web.liang' >a/1.html

echo 'kong' >a/1.html

if ( $host ~* liang.com ) {

  rewrite .* http://kong.com$request_uri permanent;

  }

  访问测试 web.liang.com/a/1.html

案例5:php网站登录跳转

http://www.liang.com/login/liang.html 转为 http://www.liang.com/reg/login.php?user=liang

location /login {

  rewrite ^/login/(.*)\.html$ /reg/login.php?user=$1;

}

案例6:http://alice.liang.com ==> http://www.liang.com/alice

http://jack.liang.com ==> http://www.liang.com/jack

if ($host ~* "^www.liang.com$") {

  break;        # 跳出匹配

}

  if ($host ~* "^(.*)\.liang\.com$" ) {

    set $user $1;       # 设置变量

    rewrite .* http://www.liang.com/$user permanent;

}

mkdir /usr/share/nginx/html/{jack,alice}

echo "jack" > /usr/share/nginx/html/jack/index.html

echo "alice" > /usr/share/nginx/html/alice/index.html

案例7:访问的.sh结尾的文件则返回403操作拒绝错误

location ~* \.sh$ {

  return 403;

  #return 301 http://www.liang.com;

}

案例8:http 转换 https

(1)云主机 购买域名 申请CA证书

(2)把CA证书下载下来 解压证书

(3)在配置文件中开启443 server

server {

  listen       443;

  server_name  web.xxxx.com;     # 域名

  ssl  on;

  ssl_certificate         /etc/pki/tls/certs/server.crt;

  ssl_certificate_key  /etc/pki/tls/certs/server.key;  # 指定证书所存放的路径

  ssl_session_timeout  5m;

  ssl_protocols  SSLv2 SSLv3 TLSv1;

  ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;       # 密码指定为OpenSSL支持的格式

  ssl_prefer_server_ciphers   on;

  location / {

    root   /liang/html;

    index  index.html index.htm;

      }

  }

(4)启动证书

server {

  listen      8080;

  server_name  域名;

  return     301  https://域名$request_uri;

}

(5)访问http 自动转到 https

案例9:last、break、redirect、permanent标记

mkdir /usr/share/nginx/html/test 

echo 'break' > /usr/share/nginx/html/test/break.html

echo 'last' > /usr/share/nginx/html/test/last.html

echo 'test' > /usr/share/nginx/html/test/test.html

server {

  listen 80;

  server_name 192.168.93.136;

  location / {

    root /usr/share/nginx/html;

    index index.html index.php;

  }

  location /break {

    rewrite .* /test/break.html break;

    root /usr/share/nginx/html;

  }

  location /last {

    rewrite .* /test/last.html last;

    root /usr/share/nginx/html;

  }

  location /test {

    rewrite .* /test/test.html break;

    root /usr/share/nginx/html;

  }

}

访问测试 http://192.168.93.136/break  访问原站点

访问测试 http://192.168.93.136/last   自动跳转到下一个站点

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:13:03  更:2021-10-24 15:15:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:49:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码