1、地址重写与地址转发
地址重写
地址重写是实际上是为了实现址标准化,就像访问www.baidu.cn可以出现www.baidu.com的首页,服务器会把www.baidu.cn重写成www.baidu.com,浏览器的地址栏也会显示www.baidu.com
地址转发
地址转发一般发生在同一站点项目内,而地址重写则没有限制。
总结:
- 地址转发后客户端浏览器地址栏中的地址显示是不改变的;而地址重写后客户端浏览器地址栏中的地址改变为服务器选择确定的地址。
- 在一次地址转发整个过程中,只产生一次网络请求;而一次地址重写一般会产生两次请求。地址转发一般发生在同一站点项目内;而地址重写没有该限制。
- 地址转发的速度较地址重定向快。
- 地址转发过程中,可以将客户端请求的request范围内的属性传递给新的页面,但地址重写不可以。
rewrite常用全局变量
| 变量 | 说明 |
|---|---|
| $args | 请求中的参数,如www.123.com/1.php?a=1&b=2的$args就是a=1&b=2 |
| $body_bytes_sent | 服务器发送给客户端的响应body字节数 |
| $content_length | HTTP请求信息里的"Content-Length" |
| $conten_type | HTTP请求信息里的"Content-Type" |
| $document_root | nginx虚拟主机配置文件中的root参数对应的值 |
| $document_uri | 当前请求中不包含指令的URI,如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的参数 |
| $http_referer | 记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置 |
| $host | 主机头,也就是域名 |
| $http_user_agent | 客户端的详细信息,也就是浏览器的标识,用curl -A可以指定 |
| $http_cookie | 客户端的cookie信息 |
| $http_x_forwarded_for | 当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置 |
| $limit_rate | 如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0 |
| $remote_addr | 客户端的公网ip |
| $remote_port | 客户端的port |
| $remote_user | 如果nginx有配置认证,该变量代表客户端认证的用户名 |
| $request | 请求的URI和HTTP协议,如“GET /article-10000.html HTTP/1.1” |
| $request_body_file | 做反向代理时发给后端服务器的本地资源的名称 |
| $request_method | 请求资源的方式,GET/PUT/DELETE等 |
| $request_filename | 当前请求的资源文件的路径名称,相当于是$document_root/$document_uri的组合 |
| $request_uri | 请求的链接,包括$document_uri和$args |
| $scheme | 请求的协议,如ftp,http,https |
| $server_protocol | 客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等 |
| $server_addr | 服务器IP地址 |
| $server_name | 服务器的主机名 |
| $server_port | 服务器的端口号 |
| $status | http状态码,记录请求返回的状态码,例如:200、301、404等 |
| $uri | 和$document_uri相同 |
| $http_referer | 客户端请求时的referer,通俗讲就是该请求是通过哪个链接跳过来的,用curl -e可以指定 |
| $time_local | 记录访问时间与时区,如18/Jul/2014:17:00:01 +0800 |
rewrite指令
该指令通过正则表达式的使用来改变URI。可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理。
特别注意:
- URI ( Universal Resource Identifier,通用资源标识符),用于对网络中的各种资源进行标识,由存放资源的主机名、片段标志符和相对URI三部分组成。存放资源的主机名一般由传输协议. Scheme )、 主机和资源路径三部分组成;片段标志符指向资源内容的具体元素;相对URI表示资源在主机上的相对路径。一般格式为:
- Scheme:[//][[用户名[:密码]@]主机名[:端口名]][/资源路径]
- URL (Uniform Resource Location,统一资源定位符),是用于在Internet中描述资源的字符串,是URI 的子集,主要包括传输协议(Scheme)、主机(IP、端口号或者域名)和资源具体地址(目录和文件名)等三部分。一般格式为:Scheme:/l主机名[:端口号][/资源路径]。
- Scheme://主机名[:端口名]][/资源路径]
该指令可以在server快或者location块中配置,其语法结构为:
rewrite regex replacement [flag];
关键字 正则 替代内容 flag标记
注意:
regex,用于匹配URI的正则表达式。使用括号 "()" 标记要截取的内容。
rewrite参数的标签段位置:
server,location,if
常用正则表达式
| 字符 | 描述 |
|---|---|
| \ | 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用 |
| ^ | 匹配输入字符串的起始位置 |
| $ | 匹配输入字符串的结束位置 |
| * | 匹配前面的字符零次或者多次 |
| + | 匹配前面字符串一次或者多次 |
| ? | 匹配前面字符串的零次或者一次 |
| . | 匹配除“\n”之外的所有单个字符 |
| (pattern) | 匹配括号内的pattern |
rewrite 最后一项flag参数:
| 标记符号 | 说明 |
|---|---|
| last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
| break | 本条规则匹配完成后终止,不在匹配任何规则 |
| redirect | 返回302临时重定向 |
| permanent | 返回301永久重定向 |
示例1
无论/search 后面跟什么内容,最后都会被永久重定向到百度页面
location /search {
rewrite ^/(.*) http://baidu.com permanent;
}
示例2
创建三个文件夹,每个文件夹下有个1.html文件;
location /images {
rewrite /images/(.*) /pics/$1; //•将URL /images/1.html 重写为 /pics/1.html
}
location /pics {
rewrite /pics/(.*) /photos/$1; //•将URL /pics/1.html 重写为 /photos/1.html
}
location /photos {
}
示例3
将URL /images/1.html 重写为 /pics/1.html, 并且不再匹配其他location段
location /images {
rewrite /images/(.*) /pics/$1 break;
}
示例4
将URL /images/1.html 重写为 /pics/1.html, 重新进入server段后匹配了/pics location段,然后又被重写。
location /images {
rewrite /images/(.*) /pics/$1 last;
}
本文阐述了地址重写与地址转发的区别,包括它们的工作原理、应用场景及如何影响客户端的行为。此外,还深入探讨了Nginx中的rewrite指令及其全局变量,通过实例展示了正则表达式的应用。
888





