概述
Nginx作为反向代理服务器的首选,会有较多的跳转需求
Rewrite跳转场景
可以调整用户浏览的URL,看起来更规范,符合开发及产品人员的需求
为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务
网址换新域名后,让旧的访问跳转到新的域名上。
根据特殊变量、目录、客户端的信息进行URL调整等
Rewrite跳转实现
通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。需要PCRE支持。重写模块包含set指令set指令
Rewrite实际应用场景
使用rewrite进行匹配跳转
使用if匹配全局变量后跳转
使用location匹配再跳转
Nginx表达式
常用的元字符
Nginx Rewrite基本操作
语法
rewrite <regex> <replacement> [flag];
regex:正则匹配规则
replacement:跳转后的内容
flag:表示支持的flag标记
flag标记说明 :last 相当于 Apache 的 [L] 标记,表示完成 rewrite
break 本条规则匹配完成即终止,不再匹配后面的任何规则
redirect 返回302临时重定向,浏览器会显示跳转后的URL地址,爬虫不会更新地址
permanent 返回301临时重定向,浏览器会显示跳转后的URL地址,爬虫会更新地址
loaction分类
location = patt {} 精准匹配
location = patt {} 一般匹配
location ~ patt {} 正则匹配
正则匹配的表达式
~ :表示执行一个正则匹配,区分大小写、
~*:表示执行一个正则匹配,不区分大小写
!~:表示执行一个正则匹配,区分大小写不匹配
!~*:表示执行一个正则匹配,不区分大小写不匹配
^~:表示普通的字符串匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location
=:进行普通字符精确匹配,也就是完全匹配
@:定义一个命名的location ,在使用内部定向时,例如error_page,try_files
Location优先级
和location表达式的类型有关,相同类型的表达式,字符串长的会优先匹配
等号(=)类型的优先级最高,匹配成功不再查找其他匹配项
^~类型表达式,匹配成功不再查找其他匹配项
正则表达式类型(~和`*)优先级次之
常规字符串匹配类型,按照前缀匹配
通用匹配(/),如果没有其他匹配,任何匹配都会被请求到
location优先级
匹配具体文件
(location = 完整路径)> (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径) > (location 完整路径) > (location /)
用目录做匹配访问某个文件
(location = 目录)> (location ^~ 目录) > (location ~* 完整路径) > (location ~ 完整路径) > (location 完整路径) > (location /)
Rewire示例
准备两台服务器端和一台客户端,并在他们的host中添加下列内容
192.168.10.101 www.benet.com
192.168.10.102 www.accp.com
将主配置文件中的server_name改为www.benet.com
基于域名跳转
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
if ($host = 'www.benet.com')
{
rewrite ^/(.*)$ http://www.accp.com/$1 permanent;
}
}
[root@localhost ~]# systemctl restart nginx
用客户端访问www.benet.com会直接跳转到www.accp.com上
基于客户端 IP 访问跳转
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.benet.com;
#access_log /var/log/nginx/host.access.log main;
set $rewrite true;
if ($remote_addr = "192.168.10.51") {
set $rewrite false;
}
if ($rewrite = true) {
rewrite (.+) /maintenance.html;
}
…………
[root@localhost ~]# systemctl restart nginx
先用客户端192.168.10.51访问,能正常访问www.benet.com,再用其他IP客户端访问,打开的是maintenance.html页面
基于旧域名跳转到新域名后面加目录
[root@localhost html]# cd /usr/local/nginx/html/
[root@localhost html]# mkdir -p bbs/post
[root@localhost html]# cd bbs/post
[root@localhost post]# echo "i am bbs">index.html
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name bbs.benet.com; //需要改为bbs.benet.com
#access_log /var/log/nginx/host.access.log main;
location /post {
rewrite (.+) http://www.benet.com/bbs$1 permanent;
}
…………
[root@localhost ~]# systemctl restart nginx
在客户端浏览器地址栏输入 http://bbs.benet.com/post,会跳转到http://www.benet.com/bbs/post/
基于目录下所有 php 结尾的文件跳转
要求访问 http://www.benet.com/upload/1.php跳转到首页
[root@localhost post]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name bbs.benet.com;
#access_log /var/log/nginx/host.access.log main;
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.benet.com permanent;
}
…………
[root@localhost ~]# systemctl restart nginx
浏览器访问 http://www.benet.com/upload/1.php会跳转到http://www.benet.com
基于最普通一条 url 请求的跳转
server {
listen 80;
server_name bbs.benet.com;
#access_log /var/log/nginx/host.access.log main;
location ~* ^/1/test.html {
rewrite (.+) http://www.benet.com permanent;
}
…………
[root@localhost ~]# systemctl restart nginx
浏览器访问 http://www.benet.com/1/test.html 跳转到http://www.benet.com