8.Nginx Rewrite

这篇具有很好参考价值的文章主要介绍了8.Nginx Rewrite。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Nginx Rewrite

常用Nginx的正则表达式

^:匹配输入字符串的起始位置
$:匹配输入字符串的结束位置
*:匹配前面的字符零次或多次。如“ol*”能匹配“o”、“ol”、“oll”
+:匹配前面的字符一次或多次。如“ol+”能匹配“ol”、“oll”、“olll”,但不能匹配“o”
?:匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,“?”等效于“{0,1}”
.:匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\:将后面接着的字符标记为一个特殊字符或一个原义字符或向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d:匹配纯数字

{n}:重复n次
{n,}:重复n次或更多次
{n,m}:重复n到m次

[ ]:定义匹配的字符范围
[c]:匹配单个字符c
[a-z]:匹配a-z小写字母的任意一个
[a-zA-Z0-9]:匹配所有大小写字母或数字

( ):表达式的开始和结束位置
|:或运算符

  • 从功能看rewrite和location似乎有点像,都能实现跳转。
  • 主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器
  • rewrite对访问的域名或者域名内的URL路径地址重写
  • location对访问的路径做访问控制或者代理转发

location

location大致可以分为三类

location大致可以分为三类

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

location常用的匹配规则



=:进行普通字符精确匹配,也就是完全匹配

^~:表示普通字符匹配,使用前缀匹配。如果匹配成功,则不再匹配其它location

~:区别大小写的匹配
~*:不区分大小写的匹配
!~:区分大小写的匹配取非
!~*:不区分大小写的匹配取非

location优先级

location优先级


首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配

location示例说明

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

优先级总计

(location =完整路径) > (location ^~路径) > (location ~,~*正则顺序) > (location 部分前缀路径) > (location /)

location匹配

首先看    优先级:  精确=    >  前缀^~    >   正则   ~,~*    >     一般   >    通用/
  • 在没有精准匹配的情况下,先看前缀匹配的长度,然后根据最长的前缀匹配的优先级去确定是否再去看其它正则匹配location,

  • 如果最长的前缀匹配带有 ^~ 则不再看其它正则匹配1ocation,如果最长的前缀匹配是没有修饰符的一般匹配则会再看其它正则匹配1ocation

  • 前缀匹配看长度,最长的优先匹配

  • 正则匹配看上下顺序,由上往下依次匹配,当有匹配成功时候,停止匹配,按当前匹配规则处理请求

  • 只有在精准、前缀、正则、一般都没有匹配到的时候才会看通用匹配

实际网站使用中,至少有三个匹配规则定义

第一个必选规则

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
可以是一一个静态首页,也可以直接转发给后端应用服务器
location = / {
root html;
index index.html index.htm;
}

第二个必选规则

处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/ ;
}

location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/ ;
}

第三个规则就是通用规则,比如用来转发带 .php、.jsp 后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求
location / {
proxy_pass http:// tomcat_server;
}

网站首页使用精准匹配   
location = /index. html

动态页面正则匹配    
location ~ .*\.php$
location ~ .*\. jsp$
  
静态页面      前缀/正则/通用匹配     
location  ^~ /static   
location  ~\.()$
location \

Rewrite

  • rewrite功能是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
  • 比如:更换域名后需要保持旧的域名能跳转搭配新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求
  • rewrite只能放在server{ },location{ },if{ }中,并且默认只能对域名后面的除去传递的参数外的字符串起作用
例如http://www.ggl.com/a/we/index.php?id=1&u=str
只对/a/we/index.php重写

rewrite跳转实现

Nginx:通过ngx_http_rewrite_module模块支持URL重写、支持if条件判断,但不支持else

跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后nginx返回500错误

PCRE支持:perl兼容正则表达式的语法规则匹配

重写模块set指令:创建新的变量并设其值

8.Nginx Rewrite文章来源地址https://www.toymoban.com/news/detail-480150.html

rewrite执行顺序如下

(1)执行server块里面的rewrite指令
(2)执行location匹配
(3)执行选定的location中的rewrite指令
语法    rewrite <regex> <replacement> [flag];

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

flag标记说明

last:本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在server和if中

break:本条规则匹配完成即中止,不在匹配后面的的URL地址

redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址

permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,进入            浏览器在进行一次访问匹配

rewrite示例

基于域名的跳转
现在公司旧域名www.xyw.com有业务需求变更,需要使用新域名www.benet.com代替,
但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。


vim /usr/local/nginx/conf/nginx.conf

server {
  listen 80;
  server_name   www.ggl.com;     域名修改
  charset utf-8;
 
 access_log /var/log/nginx/www.xyw.com-access.log;           ##日志修改
 
 location / {
  #添加域名重定向
     if ($host = 'www.ggl.com') {   
     #$host为rewrite全局变量,代表请求主机头字段或主机名
     
    rewrite ^/ (.*)$ http://www.benet.com/$1 permanent ;        #$1为正则匹配的内容,即域名后边的字符串
    
     }
     root html;
     index index.html index.htm;
  }
}

echo "192.168.242.67 www.ggl.com www.benet.com" >> /etc/hosts
systemctl restart nginx
##在server中配置

server {
  listen 80;
  server_name   www.ggl.com;     域名修改
  charset utf-8;
 
 access_log /var/log/nginx/www.xyw.com-access.log;           ##日志修改
 
 if ($host = 'www.ggl.com') {
 	rewrite ^/(.*)$ http://www.benet.com/$1 permanent;
 }
 
 
 
}
基于客户端IP访问跳转
今天公司业务新版本上线,要求所有IP 访问任何内容都显示一个固定维护页面,
只有公司IP : 192.168.238.10访问正常。


vim /usr/ local/ nginx/conf/ nginx. conf


server {
  listen 80;
  server_name www.ggl.com;  #域名修改
  charset utf-8;
  
  access_log /var/1og/nginx/www.xyw.com-access.log;    
  #日志修改
  
#设置是否合法的IP标记
set $rewrite true;      #设置变量$rewrite,变量值为boole值true

#判断是否为合法IP
if ($remote_addr = "192.168.242.67") {    
#当客户端IP为192.168.242.67,将变量值设为false,不进行重写
set $rewrite false;
}

#除了合法IP,其它都是非法IP,进行重写跳转维护页面
if ($rewrite = true) {
#当变量值为true时,进行重写

rewrite ^/ /weihu. html;
#重写在访问IP后边插入/weihu.html,例如192. 168.242.67/weihu. html
}

location = /weihu.html {

root /var/www;
#网页返回/var/www/weihu.html的内容

}
基于旧域名跳转到新域名后面加目录
现在访问的是http://bbs.ggl.com/post/
现在要将这个域名下面的访问都跳转到
http://www.ggl.com/bbs/post/



vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  bbs.ggl.com www.ggl.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.ggl.com-access.log;
	#添加
	location /post {
        rewrite (.+) http://www.ggl.com/bbs$1 permanent;		#这里的$1为位置变量,代表/post
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}


基于参数匹配的跳转
##现在访问http://www.kgc.com/100-(100|200)-100.html 跳转到


http://www.kgc.com页面。
vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.kgc.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kgc.com-access.log;
	
	if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.+) http://www.kgc.com permanent;
    }

	location / {
        root   html;
        index  index.html index.htm;
    }
}
$request_uri:包含请求参数的原始URI,不包含主机名,
如:http://www.kgc.com/abc/bbs/index.html?a=1&b=2 中的 /abc/bbs/index.php?a=1&b=2


$uri:这个变量指当前的请求URI,不包括任何参数,如:/abc/bbs/index.html

$document_uri:与$uri相同,这个变量指当前的请求URI,不包括任何传递参数,如:/abc/bbs/index.html

到了这里,关于8.Nginx Rewrite的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 10个常用的正则表达式

    2024年01月18日
    浏览(41)
  • 十一、常用API——正则表达式

    目录 练习1:  正则表达式的作用 正则表达式 字符类(只匹配一个字符)  预定义字符(只匹配一个字符) 数量词 类 Pattern 正则表达式的构造摘要 反斜线、转义和引用 字符类 行结束符 组和捕获 Unicode 支持 与 Perl 5 相比较 练习2: 关于正则表达式可以使用插件生成  练习

    2024年01月19日
    浏览(79)
  • 正则表达式(常用字符简单版)

    量词 字符类 边界匹配 分组和捕获 特殊字符 字符匹配 普通字符:普通字符按照字面意义进行匹配,例如匹配字母 \\\"a\\\" 将匹配到文本中的 \\\"a\\\" 字符。 元字符:元字符具有特殊的含义,例如  d  匹配任意数字字符, w  匹配任意字母数字字符, .  匹配任意字符(除了换行符)

    2024年02月10日
    浏览(44)
  • JS正则表达式:常用正则手册/RegExp/正则积累

    一、正则基础语法 JavaScript 正则表达式 | 菜鸟教程 JS正则表达式语法大全(非常详细) 二、使用场景 2.1、 校验中国大陆手机号的正则表达式 正则 解释 序号 正则 解释 1 ^1 以数字 1 开头 2 [3456789] 第二位可以是 3、4、5、6、7、8、9 中的任意一个 3 d{9} 后面是 9 个数字 示例代码

    2024年02月14日
    浏览(50)
  • 常用正则表达式,复制粘贴即用

    目录 校验密码强度 校验中文 由数字、英文字母、下划线组成的字符串  校验邮箱地址 校验身份证号  校验日期 校验金额 校验手机号 检查IE版本 校验IP地址  校验URL  校验文件路径及扩展名  文件路径的正则表达式:  扩展名的正则表达式: 提取Hex颜色值 匹配HTML标签 密码

    2024年01月23日
    浏览(42)
  • VsCode中常用的正则表达式操作

    在vscode中可以使用正则表达式来进行搜索内容,极大的方便了我们对大量数据中需要查看的信息进行筛选,使用正则搜索时点击 .* 此文章会持续补充常用的正则操作 将搜索的内容进行全选,举例:在如下文件中我需要对NO字符进行搜索,并且选中所有的NO 选中所有匹配项快捷

    2024年02月07日
    浏览(44)
  • 【Java常用API】正则表达式练习

    目录 请使用正则表达式完成如下需求 练习题1,需求如下: 练习题2,需求如下: 正则表达式总结 练习题1,需求如下: 请编写正则表达式验证用户输入的手机号码是否满足要求 请编写正则表达式验证用户输入的邮箱号是否满足要求。 请编写正则表达式验证用户输入的电话

    2024年03月23日
    浏览(43)
  • js表单验证(常用的正则表达式)

    js表单验证的正则表达式,test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。 语法:let reg=/正则表达式主体/修饰符(可选); 方括号用于查找某个范围内的字符:         [1-10]查找任何从 1 至 10 的数字,[a-z]查找方括

    2024年01月17日
    浏览(50)
  • 15个常用的javaScript正则表达式

    c 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 onsole.log(uPattern.test(“iFat3”)); 2密码强度正则 //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符 var pPattern=/

    2024年01月17日
    浏览(62)
  • Go中常用的表单验证(正则表达式)

     对于性能要求很高的用户来说,这是一个老生常谈的问题了,他们认为应该尽量避免使用正则表达式,因为使用正则表达式的速度会比较慢。但是在目前机器性能那么强劲的情况下,对于这种简单的正则表达式效率和类型转换函数是没有什么差别的。如果你对正则表达式很

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包