示例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
实际上,这样的请求并不是正常的请求,网站会抛出一个页面,提示帖子不存在。








