访问路由location
正则表达式
匹配符 | 表示含义 |
---|---|
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” |
+ | 匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o” |
? | 匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}” |
. | 表示任意一个字符 |
\转义字符 | 用于取消特殊符号的含义 |
\d | 匹配纯数字 |
\s | 匹配空的(空格或者制表符) |
{n} | 匹配前面的子表达式n次 |
{n,} | 匹配前面的子表达式不少于n次 |
{n,m} | 匹配前面的子表达式n到m次 |
[ ] | 匹配括号中的一个字符 |
[c] | 匹配单个字符 c |
[a-z] | 匹配 a-z 小写字母的任意一个 |
[a-zA-Z0-9] | 匹配所有大小写字母或数字 |
() | 表达式的开始和结束位置 |
l | 或运算符 |
location的分类
- 精准匹配:location = / {}
- 一般匹配:location / {}
- 正则匹配:location ~ / {}
location的匹配规则
规则表达式 | 规则含义 |
---|---|
= | 进行普通字符精确匹配。也就是完全匹配 |
^~ | 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他 location |
~ | 表示执行一个正则匹配,区分大小写 |
~* | 表示执行一个正则匹配,不区分大小写 |
!~ | 表示执行一个正则匹配,区分大小写不匹配 |
!~* | 表示执行一个正则匹配,不区分大小写不匹配 |
location优先级
1.精确匹配(=)
location = / {
[ configuration A ]
}
2.前缀匹配(^~)
location ^~ /images/ {
[ configuration D ]
}
3.正则匹配(~\~*)
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
4.不带修饰的前缀匹配
location /documents/ {
[ configuration C ]
}
5.通用匹配(/)
location / {
[ configuration B ]
}
(location = 完整路径) > (location ^~ 完整路径) > (location ~ 完整路径) >(location ~ 完整路径) > (location /)通用匹配*
实际网站使用中的三个匹配规则定义
- 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。可以是一个静态首页,也可以直接转发给后端应用服务器
location = /index.html {
root html;
index index.html index.htm;
}
- 处理静态文件请求,这是nginx作为http服务器的强项有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用。
location ^~ /static/ {
root /webroot/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
- 通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器。
location / {
proxy_pass http://tomcat_server;
}
REWRITE模块
现在 Nginx 已经成为很多公司作为前端反向代理服务器的首选,在实际工作中往往会 遇到很多跳转(重写 URL)的需求。比如更换域名后需要保持旧的域名能跳转到新的域名 上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。如果在后端使用的 Apache 服务器,虽然也能做跳转,规则库也很强大,但是用 Nginx 跳转效率会更高,这也是学习 本章的目的所在。
rewrite功能
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
rewrite 跳转场景
Rewrite 跳转场景主要包括以下几种
- 可以调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求
- 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态 URL 地址伪装成静态地址提供服务
- 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com会跳转到 jd.com
- 根据特殊变量、目录、客户端的信息进行 URL 调整等。
rewrite 跳转实现
- Nginx 是通过 ngx_http_rewrite_module 模块支持 url 重写、支持 if 条件判断,但不支 持 else。
- 另外该模块需要 PCRE 支持,应在编译 Nginx 时指定 PCRE 支持,默认已经安装。
- 根据相关变量重定向和选择不同的配置,从一个 location 跳转到另一个 location,不过这样 的循环最多可以执行 10 次,超过后 Nginx 将返回 500 错误。
- 同时,重写模块包含 set 指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。
rewrite 执行顺序
- 执行server块里面的rewrite指令。
- 执行location 匹配。
- 执行选定的location中的rewrite指令。
rewrite 语法格式
rewrite <regex> <replacement> [flag];
- regex:表示正则匹配规则
- replacement:表示跳转后的内容
- flag:表示rewrite 支持的 flag 标记