总之作为一个前端er不会点nginx,你就不是一个合格前端开发。最近换了个公司,小组开发使用了nginx作为本地开发服务,我搞了半天云里雾里,于是找度娘查资料,感觉网上资料百分之九十九都是copy且不完善,于是打算自己稍微整理完善下,主要还是前端开发时需要的一些常用功能,毕竟其它功能配置就留给后台和运维小伙伴去搞吧。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
locatin匹配规则
参考链接:segmentfault.com/a/119000000…
语法:location [ = | ~ | ~* | ^~ ] uri { ... }
-
匹配优先级: =, ^~, ~/~*, 不带符号
-
如果有“=”修饰符,精确匹配某个路径,停止匹配
-
如果有这个“^~”修饰符,停止匹配
-
如果无“^~”, 最终使用正则匹配到的路径
-
字符串匹配,如果有正则也匹配到则使用正则,如果正则匹配不到,使用字符串前缀匹配最长的
文件及目录匹配判断
-
-f和!-f用来判断是否存在文件
-
-d和!-d用来判断是否存在目录
-
-e和!-e用来判断是否存在文件或目录
-
-x和!-x用来判断文件是否可执行
正则表达式匹配
-
==:等值比较
-
~:与指定正则表达式模式匹配时返回“真”,区分大小写
-
~*:与指定正则表达式模式匹配时返回“真”,不区分大小写
-
!~:与指定正则表达式模式不匹配时返回“真”,区分大小写
-
!~*:与指定正则表达式模式不匹配时返回“真”,不区分大小写
rewrite语法
rewrite regex replacement [flag];
-
last – 基本上都用这个Flag,继续查找匹配改变后URI的新location
-
break – 中止Rewirte,不在继续匹配
-
redirect – 返回临时重定向的HTTP状态302
-
permanent – 返回永久重定向的HTTP状态301
if语句判断
nginx并未提供逻辑运算,所以我们这时候只有通过设置变量的值来变相的实现逻辑运算了
需求:
if (!-e $request_uri && !-d $request_uri) {
return 404;
}
实现:
set $flag 0;
if (!-e $request_uri) {
set set $flag "${flag}1";
}
if (!-d $request_uri) {
set $flag "${flag}1";
}
if ($flag = '011') {
return 404;
}
内置变量
参考链接:tyloafer.github.io/posts/62480…
-
$args: 这个变量等于请求行中的参数,同$query_string
-
$query_string: 与$args一样
-
$content_length: 请求头中的Content-length字段
-
$content_type: 等同与请求头部的Content_Type的值
-
$document_root: 等同于当前请求的root指令指定的值
-
$host: 请求主机头字段,否则为服务器名称
-
$http_user_agent: 客户端agent信息
-
$http_cookie: 客户端cookie信息
-
$limit_rate: 允许限制的连接速率
-
$request_method: 等同于request的method,通常是“GET”或“POST”
-
$server_protocol: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1
-
$server_addr: 服务器地址,在完成一次系统调用后可以确定这个值
-
$server_port: 请求到达的服务器的端口号
-
$server_name: 服务器名称
-
$scheme: HTTP方法(如http,https)
-
$request_filename: 当前请求的文件的路径名,由root或alias和URIrequest组合而成
-
$request_body_file
-
$remote_user: 等同于用户名,由ngx_http_auth_basic_module认证
-
$remote_port: 客户端port
-
$remote_addr: 客户端ip
-
$request_uri: 包含请求参数的原始URI,不包含主机名,如:“/foo/bar.php?arg=baz”
-
$uri: 不带请求参数的当前URI,$uri不包含主机名,如“/foo/bar.html”
-
$document_uri: 与$uri一样
自定义变量
set $name "liben"
注:也可以写把变量写成${path}
location ~ /self-variable(/)(.*)$ {
set $path 'tyloafer';
return 200 "path = $path , 1 = $1 , 2 = $2";
}
GET test.tyloafer.cn/self-variab… => path = tyloafer , 1 = / , 2 = haha
location ~ /self-variable(/)(.*)$ {
set $path 'tyloafer';
if ($request_uri ~ 'haha') {
return 200 $1;
}
}
这时候在进行第一次location正则匹配是产生的$1,在进行第二次 $request_uri ~ 'haha' 正则匹配的时候会被覆盖,所以这时候,返回的是空白的,并不是上面的 /