URL看起来更规范,合理 企业会将动态URL地址假装成静态地址提供服务 网址换新域名后,让旧的访问跳转到新的域名上 服务端某些业务调整
一、Nginx跳转需求的实现方式 使用rewrite进行匹配跳转 使用if匹配全局变量后跳转 使用location匹配再跳转 二、rewrite放在server{},if{},location{}段中 三、对域名或参数字符串 使用if全局变量匹配 使用proxy_pass反向代理
语法: rewrite <regex> <replacement> [flag]; 正则 跳转后的内容 rewrite支持的flag标记
flag标记说明:
last和break比较:html
分类: location = patt {} [精准匹配] location patt {} [通常匹配] location ~ patt {} [正则匹配]
正则匹配的经常使用表达式:正则表达式
**相同类型的表达式,字符创长的会优先匹配** **按优先级排列** = 类型 ^~ 类型表达式 正则表达式(~和~*)类型 常规字符串匹配类型,按前缀匹配 一般匹配(/),若是没有其余匹配,任何请求都会匹配到
**相同点** 都能实现跳转 **不一样点** rewrite是在同一域名内更改获取资源的路径 location是对一类路径作控制访问或方向代理,还能够proxy_pass到其余机器 **rewrite会写在location里执行顺序** 执行server块里面的rewrite指令 执行location匹配 执行选定的location中的rewrite指令
##精确匹配/,主机名后面不能带任何字符串 location = / { [ configuration A ] } ##全部的地址都以/开头,这条规则将匹配到全部请求,但正则和最长字符串会优先匹配 location / { [ configuration B ] } ##匹配任何以/documents/开头的地址,当后面正则表达式没有匹配到时,才起做用 location /documents/ { [ configuration C ] } ##匹配任何以/documents/abc开头的地址,当后面正则表达式没有匹配到时,才会起做用 location ~ /documents/abc { [ configuration D ] } ##以/images/开头的地址,匹配符合后,中止往下匹配 location ^~ /images/ { [ configuration E ] } ##匹配全部以gif结尾的请求,/images/下的图片会被[configuration E]处理,由于^~的优先级更高 location ~* \.(gif|jpg|jpeg)$ { [ configuration F ] } ##最长字符匹配到/images/abc,优先级最低 location /images/abc { [ configuration G ] } ##以/images/abc开头的,优先级次之 location ~ /images/abc { [ configuration H ] } ##若是和正则~/images/abc/1.html相比,正则优先级更高 location /images/abc/1.html { [ configuration I ] }
匹配某个具体文件: (location = 完整路径)>(location ^~完整路径)>(location ~完整路径)>(location ~完整路径)>(location 完整路径)>(location /) 用目录作匹配访问某个文件: (location = 目录)>(location ^~目录/)>(location ~ 目录)>(location ~ 目录)>(location 目录)>(location /)
Nginx 由内核和模块组成。 Nginx 自己作的工做实际不多,当它接到一个 HTTP 请求时, 它仅仅是经过查找配置文件将这次请求映射到一个 location block,而此 location 中所配 置的各个指令则会启动不一样的模块去完成工做,所以模块能够看作 Nginx 真正的劳动工做者。 一般一个 location 中的指令会涉及一个 handler 模块和多个 filter 模块(固然,多个 location 能够复用同一个模块)。handler 模块负责处理请求,完成响应内容的生成,而 filter 模块对响应内容进行处理。 用户根据本身的须要所开发的模块都属于第三方模块。正是有了这么多模块的支撑, Nginx 的功能才会如此强大。 Nginx 的模块从结构上分为核心模块、基础模块和第三方模块: 核心模块:HTTP 模块、EVENT 模块和 MAIL 模块; 基础模块:HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块; 第三方模块:HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模 块。 Nginx 的模块从功能上分为以下三类: Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改 headers 信息等操做。Handlers 处理器模块通常只能有一个; Filters(过滤器模块):此类模块主要对其余处理器模块输出的内容进行修改操做,最后由 Nginx 输出; Proxies(代理类模块):此类模块是 Nginx 的 HTTP Upstream 之类的模块,这些模块主要与后端一些服务好比 FastCGI 等进行交互,实现服务代理和负载均衡等功能。
在单工做进程模式下,除主进程外,还有一个工做进程,工做进程是单线程的; 在多工做进程模式下,每一个工做进程包含多个线程。Nginx 默认为单工做进程模式。 Nginx 在启动后,会有一个 master 进程和多个 worker 进程。 master 进程主要用来管理 worker 进程,主要包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常状况下),会自动 从新启动新的 worker 进程。 master 进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不须要处理网络事件,不负责业务的执行,只会经过管理worker 进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
Nginx 不支持对外部程序的直接调用或者解析,全部的外部程序(包括 PHP)必须经过FastCGI 接口来调用。FastCGI 接口在 Linux 下是 socket(这个 socket 能够是文件 socket, 也能够是 ip socket)。 wrapper 为了调用 CGI 程序,还须要一个 FastCGI 的 wrapper(wrapper 能够理解为用于启动另外一个程序的程序),这个 wrapper 绑定在某个固定 socket 上,如端口或者文件 socket。当 Nginx 将 CGI 请求发送给这个 socket 的时候,经过 FastCGI 接口,wrapper 接收到请求,而后 Fork(派生)出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着 wrapper 再将返回的数据经过 FastCGI 接口,沿着固定的 socket传递给 Nginx;最后 Nginx 将返回的数据(html 页面或者图片)发送给客户端。