Nginx模块概述—Rewirte模块详解

Nginx工作原理

nginx由内核和模块组成

模块由结构分为:

核心模块: HTTP 模块、EVENT 模块和 MAIL 模块

基础模块: HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块

第三方模块: HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模块

由功能分为:

Handlers(处理器模块): 此类模块直接处理请求,并进行输出内容和修改 headers 信息等操作。Handlers 处理器模块一般只能有一个

Filters(过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由 Nginx 输出

Proxies(代理类模块): 此类模块是 Nginx 的 HTTP Upstream 之类的模块,这些模块主要与后端一些服务比如FastCGI 等进行交互,实现服务代理和负载均衡等功能。

这里我将带领各位详细了解基础模块中的Rewrite模块

Rewrite模块

模块应用场景:

URL看起来更规范、合理

企业会将动态URL地址伪装成静态地址提供服务

网址换新域名后,让旧的访问跳转到新的域名.上

服务端某些业务调整

想要执行Rewirte模块的跳转功能,就要依靠location、rewrite & if 这三兄弟了

Rewrite

命令格式

rewrite <regex> <replacement> [flag];

​ 其中,

代表正则表达式;

代表跳转后的URL/内容;

[flag] 代表rewrite支持的flag标记(

​ last—相当于Apache的[L]标记,表示完成rewrite;

​ break—本条规则匹配完成即终止,不再匹配后面的任何规则;

​ redirect—返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url;

​ permanent—返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url)

应用位置

​ 可应用于server{}, if{}, location{}段中

Location

用法

标记 说明
~ 执行一个正则匹配,区分大小写
~* 执行一个正则匹配,不区分大小写
!~ 执行一个正则匹配,区分大小写不匹配
!~* 执行一个正则匹配,不区分大小写不匹配
^~ 普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location
= 普通字符精确匹配,必须一模一样,完全匹配
@ 定义一个命名的location,使用在内部定向时

匹配规则

通用规则:先匹配正则,再匹配普通。

相同类型的表达式,字符串长的优先匹配,

匹配某个具体文件

​ (location =完整路径) > (location ^~完整路径) > (location ~*完整路径) > (location ~完整路径) > (location 完整路径) > (location /)

用目录做匹配访问某个文件

​ (location=目录) > (location ^~目录/)> (location ~ 目录)>(location ~*目录) > (location目录) > (location /)

当rewrite写在location中时,执行顺序为:

优先: 执行server块里面的rewrite指令

然后: 执行location匹配

最后: 执行选定的location中的rewrite指令

IF

用于执行判断,引出下一步的跳转操作,通常配合nginx自带的全局变量使用

能够用于if判断的自带变量如下:

$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相同。

感谢阅读