Nginx访问控制与参数调优的方法

2019-10-17 16:54:43于丽

示例1:

location /blog/
{
  deny all;
}

说明:针对/blog/目录,全部禁止访问,这里的deny all;可以改为return 403;.

示例2

location ~ ".bak|.ht"
{
  return 403;
}

说明:访问的uri中包含.bak字样的或者包含.ht的直接返回403状态码。

测试链接举例:

www.syushin.com/abc.bak www.syushin.com/blog/123/.htalskdjf

如果用户输入的URL是上面其中之一都会返回403。

示例3

location ~ (data|cache|tmp|image|attachment).*.php$
{
  deny all;
}

说明:请求的uri中包含data、cache、tmp、image、attachment并且以.php结尾的,全部禁止访问。

测试链接举例:

www.xxxxxx.com/aming/cache/1.php www.xxxxxxx.com/image/123.phps www.xxxxxx.com/aming/datas/1.php

基于$document_uri的访问控制

前面介绍了内置变量$document_uri含义是当前请求中不包含指令的URI。

如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的参数。

我们可以针对这个变量做访问控制。

示例1

if ($document_uri ~ "/admin/")
{
  return 403;
}

说明:当请求的uri中包含/admin/时,直接返回403.

注意:if结构中不支持使用allow和deny。

测试链接:

1. www.xxxxx.com/123/admin/1.html 匹配
2. www.xxxxx.com/admin123/1.html  不匹配
3. www.xxxxx.com/admin.php  不匹配

示例2

if ($document_uri = /admin.php)
{
  return 403;
}

说明:请求的uri为/admin.php时返回403状态码。

测试链接:

1. www.xxxxx.com/admin.php # 匹配
2. www.xxxxx.com/123/admin.php # 不匹配

示例3

if ($document_uri ~ '/data/|/cache/.*.php$')
{
  return 403;
}

说明:请求的uri包含data或者cache目录,并且是php时,返回403状态码。

测试链接:

1. www.xxxxx.com/data/123.php  # 匹配
2. www.xxxxx.com/cache1/123.php # 不匹配

基于$request_uri访问控制

$request_uri比$docuemnt_uri多了请求的参数。主要是针对请求的uri中的参数进行控制。

示例

if ($request_uri ~ "gid=d{9,12}")
{
  return 403;
}

说明:d{9,12}是正则表达式,表示9到12个数字,例如gid=1234567890就符号要求。

测试链接:

1. www.xxxxx.com/index.php?gid=1234567890&pid=111  匹配
2. www.xxxxx.com/gid=123  不匹配

背景知识:

曾经有一个客户的网站cc攻击,对方发起太多类似这样的请求:/read-123405150-1-1.html
实际上,这样的请求并不是正常的请求,网站会抛出一个页面,提示帖子不存在。