网站首页 > 精选教程 正文
Nginx全局变量
Nginx中有很多的全局变量,可以通过$变量名来使用。下面列举一些常用的全局变量:
Nginx location
location作用
location指令的作用是根据用户请求的URI来执行不同的应用。即根据用户请求的网站地址URL进行匹配,匹配成功就进行相应的操作。
语法
location的语法规则:location [=|~|~*|^~] /uri/ { … }
location匹配的变量是$uri
关于几种字符的说明
规则优先级
= 高于 ^~ 高于 ~* 等于 ~ 高于 /
示例1
注意:
有些资料上介绍location支持不匹配 !~如: location !~ 'png'{ ... }
这是错误的,location不支持 !~
如果有这样的需求,可以通过if(location优先级小于if )来实现,如: if ($uri !~ 'png') { ... }
访问控制
web2.0时代,很多网站都是以用户为中心,网站允许用户发布内容到服务器。由于为用户开放了上传功能,因此有很大的安全风险,比如黑客上传木马程序等等。因此,访问控制就很有必要配置了。
deny与allow
字面上很容易理解就是拒绝和允许。
Nginx的deny和allow指令是由ngx_http_access_module模块提供,Nginx安装默认内置了该模块。
语法
语法:allow/deny address | CIDR | unix: | all
它表示,允许/拒绝某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问。
注意:unix在1.5.1中新加入的功能。
在nginx中,allow和deny的规则是按顺序执行的。
示例1:
location / { allow 192.168.0.0/24; allow 127.0.0.1; deny all; }
说明:这段配置值允许192.168.0.0/24网段和127.0.0.1的请求,其他来源IP全部拒绝。
示例2:
location ~ "admin" { allow 192.168.30.7; deny all }
说明:访问的uri中包含admin的请求,只允许192.168.30.7这个IP的请求。
基于location的访问控制
日常上,访问控制基本是配合location来做配置的,直接例子吧。
示例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