180天云计算小白到大神-Nginx Rewrite模块

09.Nginx Rewrite模块

09.Nginx Rewrite模块

1.Rewrite基本介绍

1.1 什么是Rewrite

1.2 Rewrite应用场景

1.3 Rewrite重写原理

1.4 Rewrite重写模块

2.Rewrite重写模块

2.1 if条件判断指令

2.1.1 语法示例

2.1.2 场景示例

2.2 set设定变量指令

2.2.1 语法示例

2.2.2 场景示例

2.3 return返回数据指令

2.3.1 语法示例

2.3.2 场景实践

3.Rewrite重写Flag

3.1 测试代码准备

3.2 Break与last

3.2.1 为代码添加Break

3.2.2 为代码添加last

3.2.3 break与last区别

3.3 redirect与permanent

3.3.1 为代码添加redirect

3.3.2 为代码添加permanent

3.3.3 redirect与permanent区别

4.Rewrite 生产案例实践

4.1 Rewrite跳转示例1

4.2 Rewrite跳转示例2

4.3 Rewrite跳转示例3

4.4 Rewrite跳转示例4

4.5 Rewrite跳转示例5

4.6 Rewrite跳转示例6

4.7 Rewrite跳转示例7

4.8 Rewrite跳转示例8

4.9 Rewrite跳转示例9

4.10 Rewrite跳转示例10

4.11 Rewrite跳转示例11

4.12 禁止搜索引擎爬取站点

4.13 禁止站点资源被盗用

4.13.1 环境准备

4.13.2 配置被盗链节点

4.13.3 配置盗链节点

4.13.4 防盗链配置语法

4.13.5 防盗链配置实践

4.13.6 防盗链结果验证

1.Rewrite基本介绍

1.1 什么是Rewrite

Rewrite 主要实现url 地址重写, 以及url 地址跳转。就是将用户请求web 服务器的URL 地址重新修改为其他 URL 地址的过程。

比如说京东, google 、亚马逊都在使用

域名 重写后域名

www.z.cn www.amazon.cn

www.g.cn www.google.cn

www.360buy.com www.jd.com

58.com bj.58.com

1.2 Rewrite应用场景

1.地址跳转,用户访问www.jd.com 这个URL 时,将其定向至一个新的域名m.jd.com

2.协议跳转,将用户通过http 的请求协议重新跳转至

https 协议(实现https 主要手段)。

  1. URL 静态化,将动态URL 地址显示为静态URL 的一种技术,能提高搜索引擎抓取,并且能减少动态URL对外暴露过多的参数。

1.3 Rewrite重写原理

1.nginx和业务在一台服务器 nginx–>;

2.nginx和业务系统分开; 360buy.com rewrite

–> jd.com

1.4 Rewrite重写模块

set 设置变量

if 语句判断

return 返回返回值或URL

rewrite 重定向URL

2.Rewrite重写模块

2.1 if条件判断指令

2.1.1 语法示例

Syntax: if (condition) { … }

Default: —

Context: server, location

#~ 模糊匹配

#~* 不区分大小写的匹配

#!~ 不匹配

#= 精确匹配

2.1.2 场景示例

url.oldxu.net/index.html?id=1234 --》 proxy -->10.16.3.5:8080

#需求:匹配Nginx请求中包含id=2356的,然后代理到

10.16.3.5 的8080端口

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; default_type application/json; root /code;

location / {

index index.html;

#\d表示数字,{4} 表示4次,{4,8}表示数字出现的次数是4到8次,如gid=12345678就符合该条件。

if ( $request_uri ~* ‘id=\d{4}’ ) {

#proxy_pass

http://10.16.3.5:8080;

}

}

}

#测试

curl -L test.oldxu.net/?id=2356

2.2 set设定变量指令

2.2.1 语法示例

Syntax: set $variable value;

Default: —

Context: server, location, if

2.2.2 场景示例

#需求:通过user_agent(Header)拦截压测测试工具

#user_agent:

#chrome ,firefox, curl/7.29.0

#1.确认来请求的用户是使用的curl命令,如果是则做一个标记,设置为1;

#2.判断标记,如果标记的值假设为1,我们就拒绝,如果不为1则不处理;

server {

listen 80;

server_name set.oldxu.net;

root /code;

index index.html;

location / {

if ($http_user_agent ~* “Wget|ApacheBench”) {

set $deny_user_agent 1;

}

if ($deny_user_agent = 1){ return 403;

}

}

}

#模拟压测工具访问:

curl -A “YisouSpider” -I URL curl -A “ApacheBench” -I URL curl -A “wget” -I URL

2.3 return返回数据指令

2.3.1 语法示例

Syntax: return code;

return code [text];

return URL;

Default: —

Context: server, location, if

2.3.2 场景实践

#需求:客户端使用IE浏览器访问站点,则返回段字符串或返回错误

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; root /code;

location / {

index index.html; default_type text/html; if ( $http_user_agent ~*

“MSIE|firefox” ) {

return 200 “Change browser”;

#返回字符串 return 500;

#返回状态码 return 302

https://www.xuliangwei.com # 返回 URL,进行

站点跳转

}

}

}

3.Rewrite重写Flag

rewrite 主要是用来重写URL 或者跳转URL 的指令。

#rewrite表达式可以应用在server,location, if标签下

#关键字 正则替代内容 flag标记

Syntax: rewrite regex replacement [flag];

Default: –

Context: server, location, if

#flag

last #本条规则匹配完成后,继续向下匹配新的 location URI规则

break #本条规则匹配完成即终止,不再匹配后面的任何规则

redirect #返回302临时重定向, 地址栏会显示跳转后的地址

permanent #返回301永久重定向, 地址栏会显示跳转后的地址

3.1 测试代码准备

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; root /code;

location / {

rewrite /1.html /2.html; rewrite /2.html /3.html;

}

location /2.html {

rewrite /2.html /a.html;

}

location /3.html {

rewrite /3.html /b.html;

}

}

#准备对应代码

[root@web01]# echo “1.html” >/code/1.html

[root@web01]# echo “2.html” >/code/2.html

[root@web01]# echo “3.html” >/code/3.html

[root@web01]# echo “a.html” >/code/a.html

[root@web01]# echo “b.html” >/code/b.html

#测试结果: 当请求/1.html,最终将会访问/b.html

3.2 Break与last

3.2.1 为代码添加Break

#测试结果: 当请求/1.html,最终会访问/2.html #因为:在location{}内部,遇到break,本location{}内以及后面的所有location{}内的所有指令都不再执行。

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; root /code;

location / {

rewrite /1.html /2.html break; rewrite /2.html /3.html;

}

location /2.html {

rewrite /2.html /a.html;

}

location /3.html {

rewrite /3.html /b.html;

}

}

3.2.2 为代码添加last

#测试结果:当请求/1.html,最终会访问/a.html

#因为:在location{}内部,遇到last,本location{}内后续指令不再执行,

#而重写后的url会对所在的server{…}标签重新发起请求,从头到尾匹配一遍规则,哪个匹配则执行哪个。

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; root /code;

location / {

rewrite /1.html /2.html last; rewrite /2.html /3.html;

}

location /2.html {

rewrite /2.html /a.html;

}

location /3.html {

rewrite /3.html /b.html;

}

}

3.2.3 break与last区别

当rewrite 规则遇到break 后,本location{} 与其

他location{} 的所有规则都不执行。

当rewrite 规则遇到last 后,本location{} 里后续规则不执行,但重写后的url 会再次从头开始匹配所有Location ,哪个匹配执行哪个。

3.3 redirect与permanent

3.3.1 为代码添加redirect

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; root /code;

location / {

rewrite /1.html /2.html redirect; rewrite /2.html /3.html;

}

}

3.3.2 为代码添加permanent

#跳转后状态码为301

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; root /code;

location / {

rewrite /1.html /2.html permanent; rewrite /2.html /3.html;

}

}

3.3.3 redirect与permanent区别

跳	状		

Flag 态 排名情况

redirect 时 302 对旧网站无影响,新网站
跳 会有排名(不会)

永		新跳转网站有排名,旧网	
久			

permanent 301 站排名会被清空(缓存下

转 来)

4.Rewrite 生产案例实践

4.1 Rewrite跳转示例1

#需求:根据用户浏览器请求头中携带的语言调度到不同的页面

#/zh

#/en

url.oldxu.net --》url.oldxu.net/zh url.oldxu.net --》url.oldxu.net/en

server {

listen 80;

server_name url.oldxu.net; root /code;

if ($http_accept_language ~* “zh-CN|zh”) {

set $language /zh;

}

if ($http_accept_language ~* “en”) { set $language /en;

}

rewrite ^/$ /$language; #根据语言跳转对应

的站点

location / {

index index.html;

}

}

4.2 Rewrite跳转示例2

#需求:用户通过手机设备访问 url.oldxu.net,跳转至url.oldxu.net/m

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; root /code;

if ($http_user_agent ~* “android|iphone|ipad”) {

rewrite ^/$ /m;

}

}

4.3 Rewrite跳转示例3

#需求:用户通过手机设备访问 url.oldxu.net 跳转至 m.oldxu.net

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; root /code;

if ($http_user_agent ~* “android|iphone|ipad”) {

rewrite ^/$ http://m.oldxu.net;

}

}

server {

listen 80;

server_name m.oldxu.net; root /data/m;

location / {

index index.html;

}

}

4.4 Rewrite跳转示例4

#需求:用户通过http协议请求,能自动跳转至https协议。

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net;

rewrite ^(.*)$ https://$server_name$1 redirect;

#return 302

https:// s e r v e r n a m e server_name servernamerequest_uri;

}

server {

listen 443;

server_name url.oldxu.net; ssl on;

}

4.5 Rewrite跳转示例5

#需求: 网站在维护过程中,希望用户访问所有网站重定向至一个维护页面

[root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; root /code;

#配置示例

rewrite ^(.*)$ /wh.html break;

location / {

index index.html;

}

}

4.6 Rewrite跳转示例6

#需求: 当服务器遇到 403 404 502 等错误时,自动转到临时维护的静态页。[https://404.life/] [root@web01]# cat url.oldxu.net.conf server {

listen 80;

server_name url.oldxu.net; root /code;

location / {

index index.html;

}

#配置示例

error_page 404 403 502 = @tempdown; location @tempdown {

rewrite ^(.*)$ /wh.html break;

}

}

4.7 Rewrite跳转示例7

#公司网站在停机维护时,指定的IP能够正常访问,其他的IP跳转到维护页。

[root@web01 conf.d]# cat wh.conf server {

listen 80;

server_name url.oldxu.net; root /code;

#1.在server层下设定ip变量值为0 set $ip 0;

#2.如果来源IP是10.0.0.101 102则设定变量为ip变量为1。

if ($remote_addr =

“10.0.0.101|10.0.0.102”) {

set $ip 1;

}

#3.如果来源IP不是10.0.0.101 102、则跳转至/code/wh.html这个页面,否则不做任何处理

if ($ip = 0) {

rewrite ^(.*)$ /wh.html break;

}

#–>如果想针对某个location进行操作,则将如上配置写入location中即可

location / {

index index.html;

}

}

4.8 Rewrite跳转示例8

#需求:公司网站后台/admin,只允许公司的出口公网IP可以访问,其他的IP访问全部返回500,或直接跳转至首页

#限制访问来源IP

location /admin {

set $ip 0;

if ($remote_addr =

“61.149.186.152|139.226.172.254” ) {

set $ip 1;

}

if ($ip = 0){

return 500;

#rewrite /(.*)$

https://url.oldxu.net redirect;

}

}

4.9 Rewrite跳转示例9

#解决办法

server {

listen 80;

server_name url.oldxu.net;

#匹配域名,然后将第一个字段赋值给domain

if ( $host ~* (.).(.).(.).(.) ) { #if ( $host ~* (.)… ) {

set $domain $1;

}

rewrite ^/(.*) http://demo:27610/$domain/$1 last;

4.10 Rewrite跳转示例10

现有两台服务器,想要实现

http://console.oldxu.net/index.php? r=sur/index/sid/613192/lang/zh-Hans若访问资源

为/index.php?r=survey… 则跳转到

http://sur.oldxu.net/index.php? r=survey/index/sid/613192/lang/zh-Hans

请求的域名:http://url.oldxu.net/index.php?r=surve y/index/sid/613192/lang/zh-Hans

替换后域名:http://sur.oldxu.net/index.php?r=surve y/index/sid/613192/lang/zh-Hans

[root@web01 ~]# cat /etc/nginx/conf.d/tou.oldxu.net.conf server {

listen 80;

server_name console.oldxu.net;

root /code;

index index.html;

location / {

if ($args ~ r=survey) {

rewrite ^/(.*)

http://sur.oldxu.net$request_uri? redirect;

}

}

}

#测试

#curl -I -HHost:tou.oldxu.net http://10.0.0.7/index.php? r=survey/index/sid/613192/lang/zh-Hans HTTP/1.1 302 Moved Temporarily Server: nginx/1.18.0

Date: Wed, 18 Aug 2021 09:58:18 GMT

Content-Type: text/html

Content-Length: 145

Connection: keep-alive

Location: http://sur.oldxu.net/index.php? r=survey/index/sid/613192/lang/zh-Hans

4.11 Rewrite跳转示例11

需求:将用户请求http://url.oldxu.net/?id=2 ,替换为 http://url.oldxu.net/id/2.html

1.必须是请求id? 判断用户请求的是id这个关键参数;

2.提取整个uri中的两个字段, 将左边的做成一个变量,将右边的做成一个变量;

3.如果来源为id成立的话,则执行rewirte;

[root@web01 ~]# cat /etc/nginx/conf.d/url.oldxu.com.conf server {

listen 80;

server_name url.oldxu.net; root /code;

location / {

if ($args ~* “id”) {

set $OK 1;

}

if ($args ~* (.)=(.) ) {

set $id $1;

set $number $2;

}

if ( $OK = “1” ) {

#?这个尾缀,重定向的目标地址结尾处如

果加了?号,则不会再转发传递过来原地址问号内容

rewrite ^(.*)$ http:// s e r v e r n a m e / {server_name}/ servername/{id}/${number}.html? last;

}

}

}

4.12 禁止搜索引擎爬取站点

#需求:通过user_agent防止搜索引擎的爬取

server {

if ($http_user_agent ~* “YisouSpider|YoudaoBot|tt”) {

return 403;

}

}

curl -A “YisouSpider” -I URL curl -A “ApacheBench” -I URL

curl -A “wget” -I URL

nginx rewrite 多重判断

4.13 禁止站点资源被盗用

防盗链,指的是防止资源被其他网站恶意盗用。

如何避免网站资源被盗用:可以根据客户端请求所携带的Referer 信息来验证请求的合法性,因为 Referer 会告诉服务器它是丛哪一个域名点击过来的;

基于Referer 限制盗链:

优点:规则简单、配置和使用都很方便,

缺点:防盗链所依赖的Referer 验证信息是可以伪造的,并非100%可靠;

但基于Referer 限制盗链的方式,可以限制绝大多数盗链情况。

4.13.1 环境准备

角色 IP 域名

盗链节点(偷取资 10.0.0.7 tou.oldxu.net
源)

被盗链节点 10.0.0.8 img.oldxu.net

4.13.2 配置被盗链节点

#在 10.0.0.8 节点配置Nginx站点信息 [root@web02 ~]# cat /etc/nginx/conf.d/img.oldxu.net.conf server {

listen 80;

server_name img.oldxu.net; root /code;

location / {

index index.html;

}

}

[root@web02 ~]# systemctl reload nginx

#准备图片

[root@web02 ~]# wget -O /code/xld.jpg http://cdn.xuliangwei.com/16292754956283.jp g

4.13.3 配置盗链节点

#在 10.0.0.7 节点配置Nginx站点信息 [root@Nginx ~]# vim /etc/nginx/conf.d/tou.oldxu.net.conf server {

listen 80;

server_name tou.oldxu.net; location / {

root /code;

index index.html;

}

}

#准备html网页代码,偷取img.oldxu.net站点图片 [root@Nginx ~]# vim /code/index.html

oldxu.net

使用浏览器能正常访问到偷链的后的图片资源

4.13.4 防盗链配置语法

基于http_referer防止资源被盗用

Syntax: valid_referers none | blocked | server_names | string …; Default: —

Context: server, location

#none: Referer来源头部为空的情况

#blocked: Referer来源头部不为空,直接填写允许的域

名即可

#server_names: 来源头部包含当前的域名,可以正则匹

4.13.5 防盗链配置实践

配置所有来自*.oldxu.com 都可以访问到

img.oldxu.net 站点的图片

如果来源域名不在这个列表中,那么

$invalid_referer 变量值为1 ,后续通过if 判断,进

行错误返回;

[root@web02 ~]# vim /etc/nginx/conf.d/img.oldxu.net.conf server {

listen 80;

server_name img.oldxu.net; root /code;

location / {

index index.html;

}

location ~ .*.(jpg|jpeg|gif|png)$ {

#来源域名如何合法,invalid_referer这个变量被设置为0,否则为1

valid_referers none blocked *.oldxu.com;

if ($invalid_referer) { return 403;
#当然也可以返回一张图片给用户

rewrite ^(.*)$ /error.jpg break;

}

}

#允许 google、baidu、等站点能够(盗链)资源,那么则可以通过server_names开放

#location ~* .(gif|jpg|png|bmp)$ {

#valid_referers none blocked

*.oldxu.com server_names ~.google.

~.baidu.;

#if ($invalid_referer) {

#return 403;

#}

#}

}

#如果存在盗链,则返回一张图片

[root@web02 ~]# wget -O /code/error.jpg https://cdn.xuliangwei.com/16292786297422.j pg

[root@web02 ~]# vim /etc/nginx/conf.d/img.oldxu.net.conf server {

listen 80;

server_name img.oldxu.net; root /code;

location / {

index index.html;

}

location ~ .*.(jpg|jpeg|gif|png)$ { valid_referers none blocked

*.oldxu.com;

if (KaTeX parse error: Expected '}', got 'EOF' at end of input: …{ rewrite ^(.*) /error.jpg break;

}

}

}

4.13.6 防盗链结果验证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值