假如基于WEB根目录下,要制止用户拜访config目录,或者要制止用户拜访configini(ZF常用INI,不过建议还是放到WEB目录以外的场所),可以通过location进行配置,返回403或者404等
在nginx要制止某个或一类资源,只需要增加一个location,然后在其中采用deny all即可。
制止拜访开拓名为bat的文件,配置如下:
制止拜访configs目录,以及其下所有子目录或文件,配置如下: 留心上述configs后面的斜杠不能少,否则所有以configs开头的目录或文件都将返回403制止拜访。 已=开头表示准确匹配如 A 中只匹配根目录结尾的请愿,后面不能带任何字符串。 ^~开头表示uri以某个常规字符串开头,不是正则匹配 ~ 开头表示分辨大小写的正则匹配; ~* 开头表示不分辨大小写的正则匹配 通用匹配, 假如没有其它匹配,任何请愿都会匹配到 次序 no优先级: (location =) (location 完整路径) (location ^~ 路径) (location ~,~* 正则次序) (location 部门起始路径) () 上面的匹配结局 依照上面的location写法,以下的匹配示例成立: - config A准确彻底匹配,即使index也匹配不了 donloadsdonload - config B匹配B以后,往下没有任何匹配,使用B images1gif - configuration D匹配到F,往下匹配到D,停止往下 imagesabcdef - config D最长匹配到G,往下匹配D,停止往下你可以看到 任何以images开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配次序 documentsdocument - config C匹配到C,往下没有任何匹配,使用C documents1jpg - configuration E匹配到C,往下正则匹配到E documentsAbcjpg - config CC最长匹配到C,往下正则次序匹配到CC,不会往下到E 所以实际采用中,个人觉得至少有三个匹配条例定义,如下: rerite性能就是,采用nginx提供的全局变量或自己设置的变量,交融正则表达式和标记位实现url重写以及重定向。 rerite只能放在server{},location{},if{}中,并且只能对域名后边的革除传递的参数外的字符串起作用, 例如seanlookaeindexphp?=1u=str只对aeindexphp重写。语法rerite regex replacement [flag]; 假如相对域名或参数字符串起作用,可以采用全局变量匹配,也可以采用proxy_pass反向代理。 表明看rerite和location性能有点像,都能实现跳转,主要区别在于rerite是在同一域名内更换获取资源的路径,而location是对一类路径做管理拜访或反向代理,可以proxy_pass到其他机器。许多场合下rerite也会写在location里,它们的执行次序是: 执行server块的rerite指令 执行location匹配 执行选定的location中的rerite指令 假如其中某步URI被重写,则重新轮回执行1-3,直到找到真实存在的文件;轮回过份10次,则返回500 Internal Server Error过错。 last 相当于Apache的[L]标志,表示完成rerite break 停止执行当前虚拟主机的后续rerite指令集 redirect 返回302临时重定向,地址栏会显示跳转后的地址 permanent 返回301永久重定向,地址栏会显示跳转后的地址 由于301和302不能简朴的只返回状态码,还必要有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以懂得: last一般写在server和if中,而break一般采用在location中 last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配 break和last都能结构继续执行后面的rerite指令 当表达式只是一个变量时,假如值为空或任何以0开头的字符串都会当做false 直接对照变量和内容时,采用=或!= ~正则表达式匹配,~*不分辨大小写的匹配,!~分辨大小写的不匹配 -f和!-f用来判断是否存在文件 -d和!-d用来判断是否存在目录 -e和!-e用来判断是否存在文件或目录 -x和!-x用来判断文件是否可执行 例如: 下面是可以用作if判断的全局变量 $args: 这个变量等于请愿行中的参数,同$query_string $content_length: 请愿头中的Content-length字段。 $content_type: 请愿头中的Content-Type字段。 $document_root: 当前请愿在root指令中指定的值。 $host: 请愿主机头字段,否则为服务器名称。 $_user_agent: 客户端agent信息 $_cookie: 客户端cookie信息 $limit_rate: 这个变量可以限制连接速率。 $request_method: 客户端请愿的动作,通常为GET或POST。 $remote_addr: 客户端的IP地址。 $remote_port: 客户端的端口。 $remote_user: 已经途经Auth Basic Module验证的用户名。 $request_filename: 当前请愿的文件路径,由root或alias指令与URI请愿生成。 $scheme: HTTP想法(如,s)。 $server_protocol: 请愿采用的协议,通常是HTTP10或HTTP11。 $server_addr: 服务器地址,在完成一次系统调用后可以确认这个值。 $server_name: 服务器名称。 $server_port: 请愿达到服务器的端口号。 $request_uri: 涵盖请愿参数的原始URI,不涵盖主机名,如:”foobarphp?arg=baz”。 $uri: 不带请愿参数确当前URI,$uri不涵盖主机名,如”foobar”。 $document_uri: 与$uri雷同。 例:localhost88test1test2testphp $host:localhost $server_port:88 $request_uri:localhost88test1test2testphp $document_uri:test1test2testphp $document_root:var $request_filename:vartest1test2testphp : 匹配除换行符以外的任意字符 ?: 重复0次或1次 +: 重复1次或更多次 *: 重复0次或更多次 \d:匹配数字 ^: 匹配字符串的开端 $: 匹配字符串的介绍 {n}: 重复n次 {n,}: 重复n次或更多次 [c]: 匹配单个字符c [a-z]: 匹配a-z小写字母的任意一个 小括号()之间匹配的内容,可以在后面通过来引用,表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义不同凡响字符。 例1: 对形如imagesefuh7b3testpng的请愿,重写到data?file=testpng,于是匹配到location data,先看dataimagestestpng文件存不存在,假如存在则正常响应,假如不存在则重写tryfiles到新的image404 location,直接返回404状态码。 例2: 对形如imagesbla_500x400jpg的文件请愿,重写到resizerblajpg?th=500height=400地址,并会继续尝试匹配location。
location~*bat{
denyall;
}
location^~configs{
denyall;
}
下面详细说明nginx配置location及rerite条例重写
location={
准确匹配,主机名后面不能带任何字符串
[configurationA]
}
location{
由于所有的地址都以开头,所以这条条例将匹配到所有请愿
但是正则和最长字符串会优先匹配
[configurationB]
}
locationdocuments{
匹配任何以documents开头的地址,匹配符合以后,还要继续往下搜索
只有后面的正则表达式没有匹配到时,这一条才会使用这一条
[configurationC]
}
location~documentsAbc{
匹配任何以documents开头的地址,匹配符合以后,还要继续往下搜索
只有后面的正则表达式没有匹配到时,这一条才会使用这一条
[configurationCC]
}
location^~images{
匹配任何以images开头的地址,匹配符合以后,停止往下搜索正则,使用这一条。
[configurationD]
}
location~*\(gif|jpg|jpeg)${
匹配所有以gif,jpg或jpeg结尾的请愿
然而,所有请愿images下的图片会被configD处置,由于^~达到不了这一条正则
[configurationE]
}
locationimages{
字符匹配到images,继续往下,会发明^~存在
[configurationF]
}
locationimagesabc{
最长字符匹配到imagesabc,继续往下,会发明^~存在
F与G的放置次序是没有关系的
[configurationG]
}
location~imagesabc{
只有去掉configD才有效:先最长匹配configG开头的地址,继续往下搜索,匹配到这一条正则,使用
[configurationH]
}
location~*js*\js
直接匹配网站根,通过域名拜访网站首页对照频繁,采用这个会加速处置,如是说。
这里是直接转发给后端利用服务器了,也可以是一个静态首页
第一个必选条例
location={
proxy_passtomcat8080index
}
第二个必选条例是处置静态文件请愿,这是nginx作为服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配采用
location^~static{
rootebrootstatic;
}
location~*\(gif|jpg|jpeg|png|css|js|ico)${
rootebrootres;
}
第三个条例就是通用条例,用来转发动态请愿到后端利用服务器
非静态文件请愿就默认是动态请愿,自己依据实际掌握
终究目前的一些框架的流行,带php,jsp后缀的场合很少了
location{
proxy_passtomcat8080
}
Rerite条例
flag标记位
if指令与全局变量
if判断指令
语法为if(condition){},对给定的条件condition进行判断。假如为真,大括号内的rerite指令将被执行,if条件(conditon)可以是如下任何内容:
if($_user_agent~MSIE){
rerite^(*)$msiebreak;
}假如UA涵盖MSIE,rerite请愿到ms目录下
if($_cookie~*=([^;]+)(?;|$)){
set$;
}假如cookie匹配正则,设置变量$等于正则引用部门
if($request_method=POST){
return405;
}假如提交想法为POST,则返回状态405(Methodnotalloed)。return不能返回301,302
if($slo){
limit_rate10k;
}限速,$slo可以通过set指令设置
if(!-f$request_filename){
break;
proxy_pass127001;
}假如请愿的文件名不存在,则反向代理到localhost。这里的break也是停止rerite查验
if($args~post=140){
rerite^examplepermanent;
}假如querystring中涵盖post=140,永久重定向到example
location~*\(gif|jpg|png|sf|flv)${
val_referersnoneblockedjeffleileizhenfang;
if($inval_referer){
return404;
}防盗链
}
全局变量
常用正则
rerite实例
{
定义image日志形式
log_formatimagelog[$time_local]$image_file$image_type$body_bytes_sent$status;
开启重写日志
rerite_logon;
server{
roothome;
location{
重写条例信息
error_loglogsreritelognotice;
留心这里要用‘’单引号引起来,避免{}
rerite^images([a-z]{2})([a-z0-9]{5})(*)\(png|jpg|gif)$data?file=;
留心不能在上面这条条例后面加上“last”参数,否则下面的set指令不会执行
set$image_file;
set$image_type;
}
locationdata{
指定针对图片的日志形式,来解析图片类型和大小
access_loglogsimageslogmian;
rootdataimages;
利用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,假如还不在就跳转到最后一个url里
try_files$arg_fileimage404;
}
location=image404{
图片不存在返回特定的信息
return404imagenotfound\n;
}
}
rerite^images(*)_(\d+)x(\d+)\(png|jpg|gif)$resizer?th=height=?last;