您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页Nginx重写功能(Rewrite)

Nginx重写功能(Rewrite)

来源:小侦探旅游网
Nginx重写功能(Rewrite)

⽬录

⼀、Nginx Rewrite概述⼆、Nginx Rewrite基本操作三、案例

1、基于域名的跳转2、基于客户端 IP 访问跳转

3、基于旧域名跳转到新域名后⾯加⽬录4、基于参数匹配(多余的)的跳转5、基于⽬录下所有 php 结尾的⽂件跳转6、基于最普通⼀条 url 请求的跳转

⼀、Nginx Rewrite概述

location是为了匹配访问的路径(URL) URL:就是⼀个具体路径/位置

URI:指的是⼀个拥有相同类型/特性的对象集合

Rewrite跳转场景

URL看起来更规范、合理

企业会将动态URL地址伪装成静态地址提供服务⽹址换新域名后,让旧的访问跳转到新的域名上服务端某些业务调整

Rewrite跳转实现

1.Nginx是通过ngx_http_rewrite_module模块⽀持url重写、⽀持if条件判断,但不⽀持else。

(Nginx哪些模块:核⼼/全局模块、HTTP模块、server模块、location if rewrite)2.另外该模块需要PCRE⽀持,应在编译Nginx时指定PCRE⽀持,默认已经安装。

3.根据相关变量重定向和选择不同的配置,从⼀个location跳转到另⼀个location,不过这样的循环最多可以执⾏10次,超过后Nginx将返回500错误。

4.同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下⾮常有⽤的,如记录条件标识、传递参数到其他location、记录做了什么等等。

Rewrite实际场景

Nginx跳转需求的实现⽅式

使⽤rewrite进⾏匹配跳转使⽤if匹配全局变量后跳转

使⽤location匹配再跳转(匹配的访问 路径URL location可以匹配本地的重写以及跨服务器的跳转)

rewrite放在server{}, if{},location{}段中

(多个server模块 sever模块⾥包含location location包含if if⾥⾯包含rewrite)location只对域名后边的除去传递参数外的字符串起作⽤

对域名或参数字符串

使⽤if全局变量匹配

使⽤proxy_pass反向代理

Nginx正则表达式(什么是正则表达式:正则是作为精确匹配、过滤、筛选的⼀种执⾏规范)作⽤:1、精确匹配,减少遍历的消耗2、节省服务响应的资源消耗3、提⾼⽤户体验感

4、提⾼服务器并发时、处理效率/性能

Nginx使⽤正则的作⽤:

Nginx作为运维⾓度前段接受、想⽤客户请求的直接对服务器所以需要考虑到Nginx的执⾏效率(精确匹配-类⽐)、性能(资源消耗)、抗压能⼒(⾼并发时处理能⼒)、⽤户体验感(⽤户访问群体)

^ :匹配输⼊字符串的起始位置$ :匹配输⼊字符串的结束位置

* :匹配前⾯的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”

+ :匹配前⾯的字符⼀次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”

:匹配前⾯的字符零次或⼀次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”

. :匹配除“\\n”之外的任何单个字符,若要匹配包括“\\n”在内的任意字符,请使⽤诸如“[.\\n]”之类的模式

\\ :将后⾯接着的字符标记为⼀个特殊字符或⼀个原义字符或⼀个向后引⽤。如“\\n”匹配⼀个换⾏符,⽽“\\$”则匹配“$”\\d :匹配纯数字

\\w :匹配字母或数字或下划线或汉字\\s :匹配任意的空⽩符

\\b :匹配单词的开始或结束{n} :重复 n 次

{n,} :重复 n 次或更多次{n,m} :重复 n 到 m 次[] :定义匹配的字符范围[c] :匹配单个字符 c

[a-z] :匹配 a-z ⼩写字母的任意⼀个

[a-zA-Z0-9] :匹配所有⼤⼩写字母或数字

() :表达式的开始和结束位置 例如:(jpg|gif|swf|)| :或运算符

Rewrite命令语法

last和break⽐较

last break

使⽤场景 ⼀般写在server和if中 ⼀般使⽤在location中URL匹配 不终⽌重写后的url匹配 终⽌重写后的url匹配

location的分类

精准匹配:location = / {…} ⽰例: location = patt {} PS: 精确匹配字符串

⼀般匹配:location / {…} ⽰例: location patt {} PS: 只要包含patt的字符串即可正则匹配:location ~ / {…} ⽰例: location ~ patt {} PS: 按照正则表达式的⽅式匹配location 常⽤的匹配规则

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

^~:表⽰普通字符匹配。使⽤前缀匹配。如果匹配成功,则不再匹配其他 location~:区分⼤⼩写的匹配

~*:不区分⼤⼩写的匹配!~:区分⼤⼩写的匹配取⾮!~*:不区分⼤⼩写的匹配取⾮

@:定义⼀个location,使⽤在内部定向的时候

location 优先级

相同类型的表达式,字符串长的优先匹配原则:越精确、越优先

⾸先精确匹配 =

其次前缀匹配 ^~(匹配普通字符、且为前缀匹配)

其次是按⽂件中顺序的正则匹配 ~或~*(宏观⽽⾔——》是否区分⼤⼩写)然后匹配不带任何修饰的前缀匹配,⽰例:/images/abc/(location /patt)最后是交给 / 通⽤匹配

location ⽰例说明

location 优先级总结

匹配某个具体⽂件

(location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径) > (location 完整路径) > (location /)location ~* 完整路径 > location ~ 完整路径 /path

⽤⽬录做匹配访问某个⽬录

(location = ⽬录) > (location ^~ ⽬录/) > (location ~ ⽬录) > (location ~* ⽬录) > (location ⽬录) > (location /)

实际⽹站使⽤中,三个匹配规则定义

#第⼀个必选规则

直接匹配⽹站根,通过域名访问⽹站⾸页⽐较频繁(www.baidu.com/),使⽤这个会加速处理,⽐如说官⽹。可以是⼀“个静态⾸页,也可以直接转发给后端“应⽤服务器” ——》PHP 、Apache location = / {root html;

index index.html index. htm;}

#第⼆个必选规则是处理静态⽂件请求,这是nginx作为http服务器的强项(1、静态请求处理的能⼒+ ⾼并发处理能⼒+资源消耗较低)有两种配置模式,⽬录匹配或后缀匹配,任选其⼀或搭配使⽤location ^~ /static/ {root /webroot/static/ ;}

location ~* \\. (html Igif ljpg ljpeglpnglcssljslico)$ {root /webroot/res/ ;}

#󰀀󰀀󰀀󰀀第三个规则就是通⽤规则,⽐如⽤来转发带.php、.jsp后缀的动态请求到后端应⽤服务器⾮静态⽂件请求就默认是动态请求(跳转/反向代理)upstream tomcat_server {

server 192.168.226.128:8080 weight 1;server 192.168.226.132:8080 weight 1;}

⽐较rewrite和location相同点:

都能实现跳转

不同点:

rewrite是在同⼀域名内更改获取资源的路径

location是对⼀类路径做控制访问或反向代理,还可以proxy_pass到其他机器rewrite改写访问的URL路径(被访问的HTML/HTM/CSS⽂件)

location对⼀类地址进⾏权限控制(认证控制)+跳转(跨服务器进⾏URL跳转)

rewrite会写location⾥,执⾏顺序执⾏server块⾥⾯的rewrite指令执⾏location匹配

执⾏选定的location中的rewrite指令 理论总结

rewrite:基本概念、应⽤场景、使⽤特点rewrite执⾏⽅式三种

rewrite regex replacement flaglocation 优先级location 和rewrite区别

三、案例

1、基于域名的跳转

#添加映射vim /etc/hosts

192.168.226.132 www.benet.com www.kgc.com#创建⽇志⽬录

mkdir -p /var/log/nginx/

#修改配置⽂件

vim /usr/local/nginx/conf/nginx.conf#在usr/local/nginx/html创建个test.html

此时访问 www.kgc.com 时会⾃动跳转到 www.benet.com 上进⾏访问。

访问www.kgc.com/test.html 时会⾃动跳转到 www.benet.com/test.html 上进⾏访问。

2、基于客户端 IP 访问跳转

今天公司业务新版本上线,要求所有(外部来访) IP 访问任何内容都显⽰⼀个固定维护页⾯,只有公司 IP 192.168.147.3访问正常。① 删除上⼀个实验的配置

mkdir -p /var/www/html

echo '

this is weihu web!

' > /var/www/html/weihu.htmlsystemctl restart nginx.service

其他主机访问页⾯

192.168.147.4访问页⾯

整理下:1、set $rewrite true; ->⽬的:给所有client端打上true标签 2、if($remote_addr='192.168.147.4')

3、if($rewrite=true)对于具有true标签的来源,进⾏全部匹配,并且重写路径为weihu.html 4、location=/weihu.html 匹配访问路径为/weihu.html的请求,指向页⾯的⽂件位置(路径)

3、基于旧域名跳转到新域名后⾯加⽬录

#创建指定⽬录

mkdir -p /usr/local/nginx/html/bbs/post

echo \"

this is 1.html

\" >> /usr/local/nginx/html/bbs/post/1.htmlecho \"192.168.147.4 bbs.kgc.com\" >> /etc/hosts

systemctl restart nginx.service

4、基于参数匹配(多余的)的跳转

5、基于⽬录下所有 php 结尾的⽂件跳转

6、基于最普通⼀条 url 请求的跳转

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务