Nginx(四)重写功能

56 阅读3分钟

访问路由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 标记

实例

基于域名

image.png

image.png

image.png

image.png

基于IP

image.png

image.png

image.png

基于旧域名跳转到新域名后面加目录

image.png

image.png

image.png

image.png

基于 普通的一条url

image.png

image.png

image.png