天天看点

Nginx基础知识之rewrite重定向的规则

作者:王啸皓月山巅

Nginx重定向:

一般设置return 403;之后,网页的页面会出现:

403 Forbidden

----------------

nginx

这种显示。

---我是华丽的分隔线---

.点匹配任何单字符

*匹配前面的字符零次或者多次。

+匹配前面的字符1次或者多次,也就是最少1次,相当于{1,}

?匹配前面的字符0次或者1次,相当于{0,1}

---我是华丽的分隔线---

正则表达式配置的语法:

rewrite regex replacement [flag]

Regex使用pcre正则表达式。

regex是^/(.*)是一个正则表达式,表示匹配所有,匹配完整的域名和后面的路径地址。

---我是华丽的分隔线---

目录对换/123456/xxxx->/xxxx?id=123456:

rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;

\d匹配一个数字字符,等价于[0-9]

+加匹配前面的子表达式一次或者多次。

点.匹配除了\n之外的任何单个字符

last:相当于apache里面的[L]标记,表示完成rewrite。

---我是华丽的分隔线----

禁止访问以.sh、.flv、.mp4为文件后缀的URL:

location ~ .*\.(sh|flv|mp4)?$ {return 403;}

? 匹配前面的表子达式零次或者一次。

\. 将下一个字符标记为一个特殊字符。

----我是华丽的分隔线----

网站信息防盗链:

在我们部署网站后,网站中的静态资源,比如网站中的图片,可以被其他网站大量盗用。为了解决这个问题,可以根据referer信息进行防盗链的设置,以免网站资源被非法盗用,造成经济损失。

HTTP协议中有一个表示“页面或者资源”来源的请求头,这个请求头我们叫做Rerferer。Referer表示请求是从哪个网址发出来的。

防盗链功能是基于HTTP协议支持的Referer机制,通过Referer跟踪请求来源,对来源进行识别和判断。

防盗链的配置可以在任意location{}下配置,不能在server{…}中配置。

location ~* \.(gif|jpg|png|swf|flv)$ {

valid_referers none blocked www.yourdomain.com *.yourdomain.com;

if($invalid_referer) {

rewrite ^/(.*) http://www.yourdomain.com/blocked.html;

}

}

~* \.(gif|jpg|png|swf|flv)$:这段正则表达式表示匹配不分大小写,以.gif、.jpg、.png、.swf、.flv等结尾的文件。

valid_referers设置信任的网站,可以正常使用图片。

后面的网站网址或者域名:referer中包含的字符串的网址。

if语句:如果链接的来源域名不在valid_referers的列表中,那么$invalid_referer为1,执行后面的操作,即进行rewrite重写。

防盗链的指令是valid_referers。可选值是none,blocked,server_name。默认值是none。

valid_referers指令会根据Referer Header头的内容,分配一个值为0或者1给变量$invalid_referer。如果Referer Header不符合valid_referers设置的有效referer,那么变量$invalid_referer将被设置为1。

valid_referers指令的参数可以是:

①:none 表示无Referer值的情况。

②: blocked 表示Referer值被防火墙伪装。

③:server_name 表示一个或者多个主机名称,server_name中可以使用通配符*星号。

介绍http头referer信息:

①:当浏览器向web 服务器发送请求时一般都会带上referer,包含当前请求页面的来源地址,即表示当前页面是通过这个来源页面里面的链接进入的。

②:后台服务器可以根据获取的referer信息,判断是否是自己信任的网站地址。如果是,则放行继续访问。如果否,则可以返回403状态信息。

③:服务端一般使用referer请求头识别访问来源,以进行统计分析、日志记录和缓存优化等。

valid_referers:

查看referer,自动和valid_referers后面的变量进行匹配,如果匹配到,就将invalid_referer变量置为0(false,合法)。如果没有匹配到,就将invalid_referer变量置为1(true,不合法)。匹配的过程中不区分大小写。

valid_referers的语法:

valid_referers none | blocked | server_names | string

none:如果Header中的Referer值为空,允许访问。

blocked: 在Header中的Referer不为空,但是该值被防火墙或者代理进行伪装过,如不带http://、https://等协议头的资源,允许访问。

server_names:指定具体的域名或者IP,可以使用通配符*。

string:支持正则表达式、带*的字符串。如果是正则表达式,需要以~开头表示。表达式将与http://或者https://之后的文本进行匹配。

使用if判断$invalid_referer,0(false,合法,不进入if块)/1(true,不合法,进入if块)。

Nginx基础知识之rewrite重定向的规则

鼓励的话语:泰山崩于前,面不改色;大海啸于后,而不变声,为大丈夫!