Rewrite

概述

1、作用:重写 URL

2、Nginx 服务器 Rewrite 实现依赖于 PCRE 支持,在编译安装 Nginx 服务器之前,需要安装 PCRE 库

3、Nginx 使用 ngx_http_rewrite_module 模块,解析、处理 Rewrite 功能的相关配置

4、地址重写、地址转发

(1)地址重写,浏览器地址会发生变化;地址转发,浏览器地址不会发生变化

(2)一次地址重写会产生两次请求,一次地址转发只会产生一次请求

(3)地址重写的页面,必须是一个完整的路径;而地址转发则不需要

(4)地址重写因为是两次请求,所以 request 范围内属性不能传递给新页面,地址转发因为是一次请求,所以可以传递值

(5)地址转发速度快于地址重写

 

Rewrite 规则

1、set

(1)设置一个新的变量

(2)语法

set $variable value;

(3)位置:server、location、if

(4)variable:变量的名称,该变量名称要用 $ 作为变量的第一个字符,且不能与 Nginx 服务器预设的全局变量同名

(5)value:变量的值,字符串、其他变量、变量组合等

Rewrite 常用全局变量 说明
$args 请求 URL 中的请求指令,功能和 $query_string 一样
$http_user_agent 用户访问服务的代理信息(如果通过浏览器访问,记录的是浏览器的相关版本信息)
$host 访问服务器的 server_name 值,即所访问的 IP地址
$document_uri 当前访问地址的 URI,功能和 $uri 一样,即 location 后的值
$document_root 当前请求对应 location 的 root 值,如果未设置,默认指向 Nginx 自带 html 目录所在位置
$content_length 请求头 Content-Length 值
$content_type 请求头 Content-Type 值
$http_cookie 客户端 Cookie 信息
$limit_rate Nginx 服务器对网络连接速率的限制,即 Nginx 配置中对 limit_rate 指令设置的值,默认是 0,不限制
$remote_addr 客户端 IP 地址 
$remote_port 客户端与服务端建立连接的端口号
$remote_user 客户端的用户名,需要有认证模块才能获取
$scheme 访问协议
$server_addr 服务端的地址
$server_name 客户端请求到达的服务器的名称
$server_port 客户端请求到达服务器的端口号
$server_protocol 客户端请求协议的版本,如:HTTP/1.1
$request_body_file 发给后端服务器的本地文件资源的名称
$request_method 客户端的请求方式,如:GET、POST 等
$request_filename 当前请求的资源文件的路径名
$request_uri 当前请求 URI,并且携带请求参数,等价于 documenturi+args 

(6)通过 log_format 指令,上述参数可以在日志文件中使用

2、if

(1)支持条件判断,并根据条件判断结果选择不同 Nginx 配置

(2)语法

if (condition){

}

(3)位置:server、location

3、判定条件(condition)

(1)变量名:如果变量名对应的值,为空字符串或 0,if 都判断为 false,其他条件为 true

if ($param){

}

(2)使用 = 和 !=,比较变量和字符串是否相等,满足条件为 true,不满足为 false

(3)字符串不需要添加 "",并且 = 和 != 前后需要加空格

(4)使用正则表达式对变量进行匹配,匹配成功返回 true,否则返回 false

(5)变量与正则表达式之间使用 ~、~*、!~、!~* 连接

(6)~:代表匹配正则表达式过程中区分大小写

(7)~*:代表匹配正则表达式过程中不区分大小写

(8)!~ 和 !~* 取相,如果匹配返回 false,不匹配返回 true

(9)正则表达式字符串一般不需要加 "",但若字符串中包含 } 或 ; 等字符时,就需要把引号加上

(10)判断请求的文件是否存在,使用 -f 和 !-f

if (-f $request_filename){
    #判断请求的文件是否存在
}
if (!-f $request_filename){
    #判断请求的文件是否不存在
}

(11)判断请求的目录是否存在,使用 -d 和 !-d

(12)判断请求的目录或者文件是否存在,使用 -e 和 !-e

(13)判断请求的文件是否可执行,使用 -x 和 !-x

4、break

(1)中断当前相同作用域中,其他 Nginx 配置

(2)与该指令处于同一作用域 Nginx 配置中,位于它前面的指令配置生效,位于后面的指令配置无效,并且终止当前的匹配,把当前 URI 在本 location 进行重定向访问处理

(3)语法

break;

(4)位置:server、location、if

5、return

(1)完成对请求的处理,直接向客户端返回

(2)在 return 之后,所有 Nginx 配置都是无效的

(3)语法

return code [text];
return code URL;
return URL;

(4)位置:server、location、if

(5)code:返回给客户端的 HTTP 状态代理,可以返回的状态代码为 0 ~ 999 的任意 HTTP 状态代理

(6)text:返回给客户端的响应体内容,支持使用变量

(7)URL:返回给客户端的 URL 地址

6、rewrite

(1)通过使用正则表达式,改变 URI

(2)可以同时存在一个或者多个指令,按照顺序依次对 URL 进行匹配和处理

(3)语法

rewrite regex replacement [flag];

(4)位置:server、location、if

(5)regex:匹配 URI 的正则表达式

(6)replacement:匹配成功后,用于替换 URI 中匹配 regex 内容的字符串,如果该字符串以 http:// 或 https:// 开头,则不会继续向下对 URI 进行其他处理,而是直接返回重写后的 URI 给客户端

(7)flag:设置 rewrite 对 URI 处理行为,可选值如下

(8)last:终止继续在本 location 块中处理接收到的 URI,并将此处重写的 URI 作为一个新 URI,使用各 location 块进行处理,该标志将重写后的 URI,重新在 server 块中执行,为重写后的 URI 提供转入到其他 location 块的机会

(9)break:将此处重写的 URI 作为一个新的 URI,在本 location 块中继续进行处理,该标志将重写后的地址,在当前 location 块中执行,不会将新的 URI 转向其他 location 块

(10)redirect:将重写后的 URI 返回给客户端,状态码为 302,指明是临时重定向 URI,主要用在 replacement 变量不是以 http:// 或 https:// 开头的情况

(11)permanent:将重写后的 URI 返回给客户端,状态码为 301,指明是永久重定向 URI,主要用在 replacement 变量不是以 http:// 或 https:// 开头的情况

7、rewrite_log

(1)配置是否开启 URL 重写日志的输出功能

(2)语法

rewrite_log on|off;

(3)默认值

rewrite_log off;

(4)位置:http、server、location、if

(5)开启后,URL 重写的相关日志,将以 notice 级别输出到 error_log 指令配置的日志文件汇总

 

rewrite 应用

1、域名跳转 / URL 转发

(1)将一个域名指向到另外一个已存在的站点

(2)URL 转发服务,实现多个域名指向一个网站或网站子目录

2、域名镜像

(1)镜像网站:将一个完全相同的网站,分别放置到几台服务器上,并分别使用独立 URL 进行访问

(2)其中一台服务器上的网站叫主站,其他为镜像网站,镜像网站和主站没有太大区别,可以把镜像网站理解为主站的一个备份节点

(3)通过镜像网站,提供网站在不同地区的响应速度、平衡网站的流量负载、解决网络宽带限制、封锁等

3、独立域名

(1)一个完整的项目包含多个模块,为每一个模块设置独立的域名

4、合并目录

(1)搜索引擎优化:利用搜索引擎的搜索规则,提高目的网站在有关搜索引擎内排名

(2)URL 目录层级一般不要超过三层

5、完善防盗链

posted @   半条咸鱼  阅读(411)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示