nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > nginx Rewrite重写地址

nginx Rewrite重写地址的实现

作者:烟花雨..

本文主要介绍了nginx Rewrite重写地址的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、Nginx正则表达式

常用的正则表达式元字符

字符说明
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
匹配前面的字符零次或一次
.匹配除“\n”之外的任何单个字符
\将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d匹配纯数字
{n}重复n次
{n,m}重复n次或更多次
[ ]定义匹配的字符范围
[c]匹配单个字符c
[a-z]匹配a-z小写字母的任意一个
[a-zA-Z]匹配a-z小写字母或A-Z大写字母的任意一个
()表达式的开始和结束位置
l或运算符

从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

二、location

2.1、location大致可以分为三类

2.2、 location 常用的匹配规则

=进行普通字符精确匹配,也就是完全匹配
^~表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location
~匹配大小写的匹配
~*不区分大小写的匹配
!~区分大小写的匹配取非
!~*不区分大小写的匹配取非

2.3、 location优先级

2.4、location示例说明

(1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。

(2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)

(3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

(4)location /documents/abc {}    www.baidu.com
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

(6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

(7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

(8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

优先级总结:
(location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

2.5、location 匹配

2.6、实际网站使用中,至少有三个匹配规则定义

1.第一个必选规则

location = / {
    root   html;
	index  index.html index.htm;
}

2.第二个必选规则

是处理静态文件请求,这是nginx作为http服务器的强项 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

location ^~ /static/ {
    root /webroot/static/;
}

location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

3.第三个规则

就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器

非静态文件请求就默认是动态请求

location / {
    proxy_pass http://tomcat_server;
}

三、rewrite

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用, 例如 http://www.kgc.com/abc/bbs/index.php?a=1&b=2只对/abc/bbs/index.php重写。

URL:就是具体路径/位置
URl:指的是一个拥有相同类型/特性的对象集合

3.1、rewrite跳转实现

3.2、rewrite执行顺序

3.3、语法格式

rewrite <regex> <replacement> [flag];

3.4、flag标记说明

四、rewrite 示例

4.1、基于域名的跳转

现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.gc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.gc.com.access.log;
    location / {
        if ($host = 'www.gc.com'){
            rewrite ^/(.*)$ http://www.qqq.com/$1 permanent;
        }
        root   html;
        index  index.html index.htm;
    }
}

echo "192.168.132.6 www.gc.com www.qqq.com" >> /etc/hosts
mkdir -p /var/log/nginx/

systemctl restart nginx
cd /usr/local/nginx/html/test
vim 1.html

将对应的ip和域名写入etc下hosts文件

浏览器输入模拟访问 http://www.gc.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.qqq.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

4.2、基于客户端 IP 访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.80.10访问正常。

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.gc.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.gc.com-access.log;		#日志修改

	#设置是否合法的IP标记
    set $rewrite true;							#设置变量$rewrite,变量值为boole值true
    #判断是否为合法IP
	if ($remote_addr = "192.168.190.52"){		#当客户端IP为192.168.190.52时,将变量值设为false,不进行重写
        set $rewrite false;
    }
	#除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){						#当变量值为true时,进行重写
        rewrite (.+) /weihu.html;				#将域名后边的路径重写成/weihu.html,例如www.kgc.com/weihu.html
    }
    location = /weihu.html {
        root /var/www/html;						#网页返回/var/www/html/weihu.html的内容
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}


mkdir -p /var/www/html/
echo "<h1>正在维护!!!等会再来</h1>" > /var/www/html/weihu.html
systemctl restart nginx

只有 IP 为 192.168.190.52 能正常访问,其它地址都是维护页面

换一个台服务器访问 显示 访问失败

4.3、基于旧域名跳转到新域名后面加目录

现在访问的是 http://bbs.gc.com/post/,现在需要将这个域名下面的访问都跳转到http://www.gc.com/bbs/post/

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  bbs.gc.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.gc.com-access.log;
	#添加
	location /post {
        rewrite (.+) http://www.gc.com/bbs$1 permanent;		#这里的$1为位置变量,代表/post
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}


mkdir -p /usr/local/nginx/html/bbs/post
echo "this is 1.html"  >> /usr/local/nginx/html/bbs/post/1.html
echo "192.168.190.52 bbs.gc.com www.gc.com"  >> /etc/hosts
systemctl restart nginx

http://bbs.gc.com/post/1.html 跳转到 http://www.gc.com/bbs/post/1.html

4.4、基于参数匹配的跳转

现在访问http://www.gc.com/100-(100|200)-100(任意数字).html 跳转到http://www.gc.com页面。

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.gc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.gc.com.access.log;

    if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.+) http://www.gc.com permanent;
    }

    location / {
        root   html;
        index  index.html index.htm;
    }
}

echo "192.168.190.52 www.gc.com" >> /etc/hosts
systemctl restart nginx

浏览器访问
http://www.gc.com/100-200-100.html 或 
http://www.gc.com/100-100-100.html 跳转到http://www.gc.com页面。

4.5、基于目录下所有 php 结尾的文件跳转

要求访问 http://www.gc.com/upload/abc.php 跳转到首页。

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.gc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.gc.com.access.log;
    
location ~* /upload/.*\.php$ {
    rewrite (.+) http://www.gc.com permanent;
}

location / {
    root   html;
    index  index.html index.htm;
}
}

echo "192.168.190.52 www.gc.com" >> /etc/hosts
systemctl restart nginx

浏览器访问
http://www.gc.com/upload/abc.php 跳转到http://www.gc.com页面。

4.6、基于最普通一条 url 请求的跳转

​要求访问一个具体的页面如 http://www.gc.com/abc/123.html 跳转到首页

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.gc.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.gc.com-access.log;
	
    location ~* ^/abc/123.html {
        rewrite (.+) http://www.gc.com permanent;
    }

	location / {
        root   html;
        index  index.html index.htm;
    }
}

systemctl restart nginx

浏览器访问 http://www.gc.com/abc/123.html 跳转到http://www.gc.com页面。

五、总结

本章内容讲述了Rewrite跳转实现、nginx中正则的表达方法以及关于location的匹配。更多相关nginx Rewrite重写地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文