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中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SpringBoot3匹配Mybatis3的错误与解决方案

《SpringBoot3匹配Mybatis3的错误与解决方案》文章指出SpringBoot3与MyBatis3兼容性问题,因未更新MyBatis-Plus依赖至SpringBoot3专用坐标,导致类冲... 目录SpringBoot3匹配MyBATis3的错误与解决mybatis在SpringBoot3如果

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

Spring Security重写AuthenticationManager实现账号密码登录或者手机号码登录

《SpringSecurity重写AuthenticationManager实现账号密码登录或者手机号码登录》本文主要介绍了SpringSecurity重写AuthenticationManage... 目录一、创建自定义认证提供者CustomAuthenticationProvider二、创建认证业务Us

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

Nginx禁用TLSv1.0 1.1改为TLSv1.2 1.3的操作方法

《Nginx禁用TLSv1.01.1改为TLSv1.21.3的操作方法》使用MozillaSSL配置工具生成配置,修改nginx.conf的ssl_protocols和ssl_ciphers,通... 目录方法一:方法二:使用 MoziChina编程lla 提供的 在线生成SSL配置工具,根据自己的环境填充对应的

nginx配置错误日志的实现步骤

《nginx配置错误日志的实现步骤》配置nginx代理过程中,如果出现错误,需要看日志,可以把nginx日志配置出来,以便快速定位日志问题,下面就来介绍一下nginx配置错误日志的实现步骤,感兴趣的可... 目录前言nginx配置错误日志总结前言在配置nginx代理过程中,如果出现错误,需要看日志,可以把

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499