Nginx的Location匹配与Rewrite重写

2024-06-04 00:36

本文主要是介绍Nginx的Location匹配与Rewrite重写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一.Nginx中location与rewrite

1.Nginx中常用正则表达式

2.location与rewrite的联系和区别

二.location概述

1.分类

2.匹配规则

3.优先级

4.示例

三.rewrite概述

1.rewrite功能

2.rewrite执行顺序

3.跳转实现

4.语法格式

5.示例

5.1.基于域名的跳转

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


一.Nginx中location与rewrite

1.Nginx中常用正则表达式

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

2.location与rewrite的联系和区别

  • rewrite 对访问的域名或者域名内的URL路径地址重写
  • location 对访问的路径做访问控制或者代理转发
     

从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更

改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他

机器

二.location概述

1.分类

location 大致可以分为三类

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

2.匹配规则

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

3.优先级

优先级:精准匹配 =  >  最长前缀匹配 ^~  >  正则匹配 ~ ~* !~ !~*  >  一般前缀匹配 /XXXX  >  通用

匹配 /

  • 在没有合适的精准匹配的情况下,先看前缀匹配的长度,取最长匹配的location(如果此最长匹配是带有^~的则不再看正则匹配;如果此最长匹配是不带有^~的则会继续再看正则匹配)
  • 前缀匹配看长度,最长的优先匹配;正则匹配看上下顺序,根据nginx配置文件的配置由上往下依次匹配,匹配到即停止

4.示例

(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 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

三.rewrite概述

1.rewrite功能

使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向

  • 更换域名后需要保持旧的域名能跳转到新的域名上
  • 某网页发生改变需要跳转到新的页面
  • 网站防盗链等等需求

注意:rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的

字符串起作用

例如 http://www.xy101.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写

2.rewrite执行顺序

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

3.跳转实现

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

4.语法格式

rewrite <regex> <replacement> [flag];

  • regex :表示正则匹配规则
  • replacement :表示跳转后的内容
  • flag :表示 rewrite 支持的 flag 标记

补充:flag标记说明

  • last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中
  • break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中
  • redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

5.示例

5.1.基于域名的跳转

现在公司旧域名www.xx10.com有业务需求变更,需要使用新域名www.xx11.com代替,但是旧

域名不能废除,需要跳转到新域名上,而且后面的参数保持不变

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.xx10.com;		                      #域名修改	charset utf-8;access_log  /var/log/nginx/www.xx10.com-access.log;  #日志修改location / {#添加域名重定向if ($host = 'www.xx10.com'){					  #$host为rewrite全局变量,代表请求主 机头字段或主机名rewrite ^/(.*)$ http://www.xx11.com/$1 permanent;	#$1为正则匹配的内容,即“域名/”之后的字符串}root   html;index  index.html index.htm;}
}echo "192.168.80.101 www.xx10.com www.xx11.com" >> /etc/hosts
systemctl restart nginx
浏览器输入模拟访问 http://www.xx10.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.xx11.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

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

现在访问的是 http://bbs.xx10.com/post/,现在需要将这个域名下面的访问都跳转到

http://www.xx10.com/bbs/post/

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  bbs.xx10.com www.xx10.com;		          #域名修改	charset utf-8;access_log  /var/log/nginx/www.xx10.com-access.log;#添加location /post {rewrite (.+) http://www.xx10.com/bbs$1 permanent;	  #这里的$1为位置变量,代表/post}location / {root   html;index  index.html index.htm;}
}mkdir -p /usr/local/nginx/html/bbs/post
echo "this is 1.html"  >> /usr/local/nginx/html/bbs/post/1.html
echo "192.168.80.101 bbs.xx10.com"  >> /etc/hosts
systemctl restart nginx
使用浏览器访问 http://bbs.xx10.com/post/1.html 跳转到 http://www.xx10.com/bbs/post/1.html

这篇关于Nginx的Location匹配与Rewrite重写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028559

相关文章

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

nginx部署https网站的实现步骤(亲测)

《nginx部署https网站的实现步骤(亲测)》本文详细介绍了使用Nginx在保持与http服务兼容的情况下部署HTTPS,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录步骤 1:安装 Nginx步骤 2:获取 SSL 证书步骤 3:手动配置 Nginx步骤 4:测

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由