首页 > 系统相关 >Nginx的Location匹配与Rewrite重写

Nginx的Location匹配与Rewrite重写

时间:2024-06-03 22:34:32浏览次数:14  
标签:匹配 rewrite Rewrite Nginx 域名 location 跳转 com Location

目录

一.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

标签:匹配,rewrite,Rewrite,Nginx,域名,location,跳转,com,Location
From: https://blog.csdn.net/F12138X/article/details/139405355

相关文章

  • Nginx Rewrite
    目录1.Nginx正则表达式2.location概述2.1 location匹配规则2.2location优先级3.rewrite概述4.rewrite实例操作4.1基于域名的跳转4.2基于客户端IP访问跳转4.3基于旧域名跳转到新域名后面加目录4.4基于参数匹配的跳转4.5基于目录下所有php结尾的文件跳转4.......
  • 从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?
    前言大家好,我是老马。很高兴遇到你。作为一个java开发者,工作中一直在使用nginx。却发现一直停留在使用层面,无法深入理解。有一天我在想,为什么不能有一个java版本的nginx呢?一者是理解nginx的设计灵魂,再者java开发者用java语言的服务器不是更加自然吗。于是动手开......
  • nginx实现网页缓存防篡改
    简介使用网站防篡改对指定的敏感页面设置缓存,缓存后即使源站页面内容被恶意篡改,WAF也会向访问者返回预先缓存好的页面内容,确保用户看到正确的页面。启用 网页防篡改、敏感信息防泄露开关,才能使用该功能。填写精确的要防护的路径,可以防护该路径下的text、html和图片等内容......
  • Nginx设置反向代理
    源码编译安装Nginx参考:https://i.cnblogs.com/posts/edit-done;postId=9010150;isPublished=false设置include因为反向代理主机较多设置include可以模块化各个主机nginx配置文件#sed'/#/d'/usr/local/nginx/conf/nginx.conf|sed'/^$/d'worker_processes1;events{......
  • awk统计访问nginx日志次数
    ###查询nginx日志的访问IP次数[root@localhostnginx]#awk'{a[$3]++}END{for(vina)printv,a[v]}'access.log|grep192.168.1.33192.168.1.3338018[root@localhostnginx]####查询nginx的状态码次数,统计192.168.1.33、192.168.1.10访问日志里面的状态码次数[root@loca......
  • Nginx配置负载均衡
    负载均衡是一种将请求均匀分发到多个服务器上,以提高系统的可用性和性能的技术。在Nginx中配置负载均衡可以通过使用upstream模块实现。以下是一个简单的Nginx配置负载均衡的示例:1.首先,在Nginx的配置文件中定义一个upstream块,用于指定负载均衡的服务器列表和负载均衡算法。例......
  • Nginx实现缓存
    目录资源列表基础环境关闭防火墙关闭内核安全机制修改主机名一、安装httpd二、安装nginx准备nginx源配置nginx启动部分页面不缓存(可选)测试在client节点请求nginx关闭httpd请求nginx        本文详细记录了nginx实现缓存的配置步骤,nginx是一个非常优秀......
  • Nginx网络服务
    一.nginx介绍Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它在性能、稳定性、丰富的功能和低系统资源消耗等方面表现优异,因此被广泛应用于互联网的各个领域。功能介绍:HTTP服务器功能:Nginx最常见的用途之一是作为HTTP服务器。它可......
  • Nginx网站服务
    目录一、Nginx服务基础二、Nginx访问控制三、Nginx虚拟主机四、编译安装Nginx服务1.关闭防火墙,将安装nginx所需软件包传到/opt目录下2.安装依赖包3.创建运行用户、组(Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)4.编译......
  • Docker环境下部署Tomcat、Nginx
    docker部署常见应用-Tomcat&Nginx为了简便先禁用防火墙systemctlstopfirewalld部署基本流程搜索镜像——拉取镜像——创建专用目录——运行容器——测试部署Tomcat1.搜索镜像dockersearchtomcat2.拉取镜像dockerpulltomcat3.创建tomcat专用目录#我......