rewrite
rewrite 正则表达式 更换目标 [标志位]nginx中rewrite 与location的区别:
rewrite与location的功能有点像,主要区别 :rewrite是在同一域名内更改获取资源的路径,
而location是对路径做控制访问或反向代理,可以使用proxy_pass 到其他主机,很多情况
下rewrite也会写在location里,它们的执行顺序是~
【1】执行server块的rewrite指令
【2】执行location匹配
【3】执行选定的location中rewrite指令
注意:如果某一部分的URI被重写,则重新循环1到3,直到找到真实存在的文件,循环超
过10次,则返回500 Internal Server Error的错误(服务器遇到了一个未曾预料的状况,导致
了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。) ······························································································································
一、nginx正则及location匹配
1、location规则匹配
^~:标识符后面跟一个字符串,匹配字符串后停止对后续的正则表达式匹配
=:精准匹配
~:区分大小写的匹配
~*:不区分大小写的匹配
!~:对区分大小写的匹配取非
!~*:对不区分大小写的匹配取非
/ :通用匹配,如果没有其它匹配,任何请求都会匹配到
2、正则表达式
* :重复前面的字符0次或多次
?:重复前面的字符或0次或1次
+ :重复前面的字符1次或多次
. :匹配除换行符以外的任意1个字符
(a|b) :匹配a或b
^:以……开头
$:以……结尾
{n}:重复前面的字符n次
{n,}:重复前面的字符至少n次
{n,m}:重复前面的字符n到m次
*?:重复前面的字符0次或多次;尽可能少重复
+?:重复前面的字符1次或多次;尽可能少重复
??:重复前面的字符或0次或1次;尽可能少重复
{n,m}?:重复前面的字符n到m次;尽可能少重复
{n,}?:重复前面的字符至少n次;尽可能少重复
3、正则表达式补充
\W:匹配不是字母、数字、汉字、下划线的字符
\S:匹配不是空白符的字符
\D:匹配非数字的字符
\B:匹配不是单词开头或结尾的字符
【a】:匹配单个字符a
【a-z】:匹配a-z
【^a-z】:匹配非a-z的字符
4、Location的应用规则
location 【=|~|~*|^~|!~|!~*】 /url {……}
默认值 : no
使用字段:server
5、匹配的优先级
= :精准匹配 优先级最高
完整路径 |
^~路径 |
正则表达式 |
部分路径 V
/ 优先级最低
6、实际使用建议
1)直接匹配网站跟,通过域名访问网站首页比较频繁,使用这个会加速处理
location = / {
proxy_pass http://tomcat:8080;
}
2)处理静态文件请求。
目录匹配:
location ^~ /static/ {
root /usr/local/nginx/jtml/static;
}
后缀匹配:
location ~* \.(gif|jpg|jpeg|png|css|js|ico) {
root /webroot/res/;
}
3)通用规则;用来转发动态请求到后端应用服务器,
location / {
proxy_pass http://tomcat:8080/;
}
二、rewrite 规则
1、功能:
使用nginx提供的全局变量或给自己设置的变量,结合正则表达式和标志位实现url的重写以及重定向,rewrite只能放在server{}、location{}、if{}中,而且只能对域名后边除去传递参数外的字符串起作用。
2、语法:
rewrite 正则表达式 更换目标 【标志位】
执行顺序:
执行Server块中的rewrite指令
执行Location匹配
执行Location中的rewrite指令
注:如果其中某步的url被重写,则重新执行1-3,知道找到文件,循环超过10次,返回500
错误
3、flag标志位
last : 表示完成rewrite(代表动作结束)
break :本条规则匹配完后,终止匹配,不在匹配后面的规则
redirect :返回302临时重定向,浏览器地址栏显示跳转后的地址
permanent :返回301永久重定向,浏览器地址栏显示跳转后的地址
注:last一般写在server和if中,而break一般使用在location中
last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
break和last都能组织继续执行后面的rewrite指令
4、if判断与全局变量
语法:if (condition) {.....}
=和!=:比较变量内容
-f和 !-f:用来判断是否存在文件
-d和 !-d:用来判断是否存在目录
-e和 !-e:用来判断是否存在文件或目录
-x和 !-x:用来判断是否可执行
5、nginx内置变量
$args : #这个变量等于请求行中的参数,同$query_string (?后面的东西)
$content_length : 请求头中的Content-length字段
$content_type : 请求头中的Content-Type字段
$document_root : 当前请求在root指令中指定的值
$host : 请求主机头字段,否则为服务器名称
$http_user_agent : 客户端agent信息
$http_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方法(如http,https)
$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1
$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值
$server_name : 服务器名称
$server_port : 请求到达服务器的端口号
$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”
$uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”
$document_uri : 与$uri相同