-e $request_filename + nginx内置变量
-e表示只要filename存在,则为真,不管filename是什么类型,当然这里加了!就取反
额外的一些
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为
举例,例如thinkphp常用的:
location / { #任何请求都会匹配
if (!-e $request_filename) { #当请求的文件不存在的时候
#进行重写比如:https://www.bossedm.com/Admin/main/main/sid/3a419dad80a25366a00a95c15e4378bb.html 通过正则匹配变成了https://www.bossedm.com/index.php?s=Admin/main/main/sid/3a419dad80a25366a00a95c15e4378bb.html
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
nginx官方解释:
last:
stops processing the current set of ngx_http_rewrite_module
directives followed by a search for a new location matching
the changed URI;
break:
stops processing the current set of ngx_http_rewrite_module
directives;
break语句
使用环境:server,location,if;
该指令的作用是完成当前的规则集,不再处理rewrite指令。
如果是直接请求某个真实存在的文件,则用break语句停止rewrite检查:
if (-f $request_filename) {
break;
}
if指令
使用环境:server,location
该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。
(参考https://www.cnblogs.com/xuey/p/7631690.html)
return指令
语法:return code ;
使用环境:server,location,if;
该指令用于结束规则的执行并返回状态码给客户端。
示例:如果访问的URL以".sh"或".bash"结尾,则返回403状态码
location ~ .*\.(sh|bash)?$
{
return 403;
}
Set指令
语法:setvariable value ; 默认值:none; 使用环境:server,location,if;
该指令用于定义一个变量,并给变量赋值。变量的值可以为文本、变量以及文本变量的联合。
示例:set $varname "hello world"; #设置$varname = "hello world"
Uninitialized_variable_warn指令
语法:uninitialized_variable_warnon|off
使用环境:http,server,location,if
该指令用于开启和关闭未初始化变量的警告信息,默认值为开启。
rewite
语法:rewriteregex replacement flag
使用环境:server,location,if
该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句,示例如下:
拿https://www.bossedm.com/Admin/main/main/sid/dae07522a605e3475c13b65c77f65586.html做例子.
if ( $host ~* www\.(.*) ) #$host内置变量应该是www.bossedm.com
{
set $host_without_www $1; #这里的将$host_without_www = "bossedm.com"
rewrite ^(.*)$ http://$host_without_www$1 permanent; #这里的重写 #$1="/Admin/main/main/sid/dae07522a605e3475c13b65c77f65586.html"
}
rewrite 最后一项flag参数:
标记符号 | 说明 |
last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
break | 本条规则匹配完成后终止,不在匹配任何规则 |
redirect | 返回302临时重定向 |
permanent | 返回301永久重定向 |
在server块下,会优先执行rewrite部分,然后才会去匹配location块,即使location写在rewriter前面,
server中的rewrite break和last没什么区别,都会去匹配location,所以没必要用last再发起新的请求,可以留空,
server中的模块只进行一次rewriter匹配对于break和last,即使进入到location之后在rewriter last之后,也不会再匹配server中的rewriter的规则(因为last直接就是找location,不是rewriter.)
如果是redirect和permanent那就不一样了,注意上面的last和break在浏览器上的url地址都是不变的,然而redirect和permanent浏览器地址都是会被重写的,所以相当于重新请求了一次nginx,所以要重来.
location中的rewirte:
不写last和break - 那么流程就是依次执行这些rewrite
1. rewrite break - url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求,地址栏url不变
2. rewrite last - url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变(并不会跳过原本的location,如果条件符合可能进入到原来的location,造成死循环- -!超过10次就500错误)
3. rewrite redirect – 返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)
4. rewrite permanent – 返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url
location 举例
location = /demo { rewrite ^ http://google.com; }
上述的配置表示只有访问 http://192.168.33.10/demo
这样的url,才能跳转到google的页面。除此之外的任何地址都无法访问,那怕是访问http://192.168.33.10/demo/
这个地址也不行。因为url匹配模式是/demo
location匹配规则及优先级
- = 严格匹配这个查询。如果找到,停止搜索。
- ^~ 匹配路径的前缀,如果找到,停止搜索。
- ~ 为区分大小写的正则匹配
- ~* 为不区分大小写匹配
- / #任何请求都会匹配
优先级: 首先精确匹配 = >其次以xx开头匹配^~ >然后是按文件中顺序的正则匹配 >最后是交给 / 通用匹配。也就是=, ^~, ~或~*, /
nginx内置变量(可能要另外做个文章写)
nginx小技巧,打印变量:
location / { default_type text/plain; return 502 $document_uri;#这里打印了$document_uri这个变量
}
打印变量参考:https://blog.csdn.net/q741983251/article/details/84255849
参考(https://www.cnblogs.com/xuey/p/7631690.html)