Nginx的重定向rewrote规则

简单介绍:

nginx的rewrite功能需要pcre软件的支持,即要通过perl兼容正则表达式语句进行规则匹配的;

默认参数编译的nginx就会支持rewrite的模块、但是也必须要pcre的支持

rewrite是实现url重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记;

[root@node-130 nginx-1.17.10]# ./configure --help | grep rewrite
  --without-http_rewrite_module      disable ngx_http_rewrite_module

rewrite语法:

rewrite	+ <regex> 	+	<replacement> +		[flag];
			正则				替代内容 		flag标记

语法的详细讲解:

  • 正则:perl兼容正则表达式语句进行规则匹配
  • 替代内容:将正则匹配的内容替换成replacement
  • flag标记:rewrite支持的flag标记
  • last :本条规则匹配完成终止当前location的规则,继续向下匹配新的location URI规则
  • break :本条规则匹配完成即终止,不再匹配后面的任何规则
  • redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址,关闭服务,无法重定向。
  • permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,关闭服务,依然可以重定向,清除缓存失效。

举例说明参数

[root@node-130 nginx]# vim /data/nginx/conf/vhost/www.liangjiawei.net.conf 
server {
        listen 80;
        server_name www.liangjiawei.net;
        location / {
                root /data/html/www/;
                index index.html index.htm;
                rewrite ^/(.*)$ http://blog.liangjiawei.net/$1 permanent;
                }
}

rewrite规则实验

实现域名跳转的实验
  • 意思就是你本来访问www.liangjiawei.net的网站
  • 然后跳转到blog.liangjiawei.net的网站

方案一:

www.liangjiawei.net的rewrite规则解释说明

  • 在这个配置文件中,指的是www.liangjiawei.net这个网站的资源
  • ^/(.*)$:这里代表的是访问的是任何数据,输入任何的东西都行
  • 相当于是正则的内容
  • “/$1”:这里代表的就是跟上网站的资源路径输入的
  • 比如说是blog.liangjiawei.net/img/–>资源
  • permanent:这是就相当于是flag标记
  • 是永久的重定向,代码是301
#编写nginx的配置文件
	#从之前的虚拟主机上编写这个rewrite规则
[root@node-130 nginx]# vim /data/nginx/conf/vhost/www.liangjiawei.net.conf 
server {
        listen 80;
        server_name www.liangjiawei.net;
        location / {
                root /data/html/www/;
                index index.html index.htm;
                rewrite ^/(.*)$ http://blog.liangjiawei.net/$1 permanent;
                }
}


#再来看看blog.liangjiawei.net配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/blog.liangjiawei.net.conf 
server {
        listen 80;
        server_name blog.liangjiawei.net;
        location / {
                root /data/html/blog/;
               index index.html index.htm;
                }
}

#重载配置文件校验
[root@node-130 nginx]# nginx -s reload
	#如果使用命令行,需要加上-I参数
[root@node-130 nginx]# curl www.liangjiawei.net -I
HTTP/1.1 301 Moved Permanently
Server: nginx/1.17.10
Date: Mon, 21 Jun 2021 08:47:11 GMT
Content-Type: text/html
Content-Length: 170
Connection: keep-alive
Location: http://blog.liangjiawei.net/

浏览器验证:跳转成功

方案二实验

修改www.liangjiawei.net的nginx配置文件

  • 需要用到return 规则
  • 指定的状态码就是302
  • 然后再指定了blog的网站
  • $request_uri;这个就是用户请求的资源
#修改配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/www.liangjiawei.net.conf 
server {
        listen 80;
        server_name www.liangjiawei.net;
        location / {
                root /data/html/www/;
                index index.html index.htm;
                return  302 http://blog.liangjiawei.net/$request_uri;
                }
}

#blog.liangjiawei.net的配置文件不变
#再来看看blog.liangjiawei.net配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/blog.liangjiawei.net.conf 
server {
        listen 80;
        server_name blog.liangjiawei.net;
        location / {
                root /data/html/blog/;
               index index.html index.htm;
                }
}

#重载配置文件校验
[root@node-130 nginx]# nginx -s reload
	#如果使用命令行,需要加上-I参数
[root@node-130 nginx]# curl -I www.liangjiawei.net
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.17.10
Date: Mon, 21 Jun 2021 08:54:06 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive
Location: http://blog.liangjiawei.net//

浏览器访问–>

方法三:

  • 这里是使用了一个if的判断语句
  • if () :意思是判断括号里面的内容
  • $host != ‘www.liangjiawei.net’ :这里的意思就是如果请求的地址不是www.liangjiawei.net这个网址
  • !=:代表的是逻辑非的概念;
  • $host = ‘www.liangjiawei.net’ 这个代表匹配到了之后执行以下操作;
  • 指定的动作就是rewrite的规则;
#修改www.liangjiawei.net的nginx配置文件
[root@node-130 nginx]# !vim
vim /data/nginx/conf/vhost/www.liangjiawei.net.conf 
server {
        listen 80;
        server_name www.liangjiawei.net;
        if ( $host = 'www.liangjiawei.net' ) {
                rewrite ^/(.*)$ http://blog.liangjiawei.net/$1 permanent;
                }       
        location / {
                root /data/html/www/;
                index index.html index.htm;
                }
}

#blog.liangjiawei.net的配置文件不变
#再来看看blog.liangjiawei.net配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/blog.liangjiawei.net.conf 
server {
        listen 80;
        server_name blog.liangjiawei.net;
        location / {
                root /data/html/blog/;
               index index.html index.htm;
                }
}

#重载配置文件校验
[root@node-130 nginx]# nginx -s reload
	#如果使用命令行,需要加上-I参数
[root@node-130 nginx]# curl -I www.liangjiawei.net
HTTP/1.1 301 Moved Permanently
Server: nginx/1.17.10
Date: Mon, 21 Jun 2021 09:02:49 GMT
Content-Type: text/html
Content-Length: 170
Connection: keep-alive
Location: http://blog.liangjiawei.net/

浏览器验证

方案四:

实现阿里云的跳转效果:

当访问mirrors.aliyum.com会自动跳转到developer.aliyun.com/mirror/

这里用bbs.liangjiawei.net的网站做个实验

#修改bbs.liangjiawei.net的配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/bbs.liangjiawei.net.conf 
server {
        listen 80;
        server_name bbs.liangjiawei.net;
        location / {
                if ( $host ~* (.*)\.(.*)\.(.*) ) {
                        set $vhost_name $1;
                        }
                rewrite ^~/(.*) http://blog.liangjiawei.net/$vhost_name/$1;
                root /data/html/bbs/;
               index index.html index.htm;
                }
}

#重载配置文件
[root@node-130 nginx]# nginx -s reload
实现不同终端的跳转实验

一个网站,有些用户是用手机访问的,

  • 手机访问的安排一个网站
  • 电脑访问的也安排上一个网站
  • 主要用的是 $http_user_agent这个来判断

这个实验就是要实现不同终端访问有不同的结果的;

#创建一个shouji.liangjiawei.net的server
[root@node-130 nginx]# vim /data/nginx/conf/vhost/shouji.liangjiawei.net.conf
server {
        listen 80;
        server_name  shouji.liangjiawei.net;
        location / {
                root /data/html/shouji;           
                index   index.html      index.htm;
                }
        }

#创建主页文件
[root@node-130 nginx]# mkdir /data/html/shouji
[root@node-130 nginx]# echo "你访问的是手机的页面哦" > /data/html/shouji/index.html

#测试一下
[root@node1 nginx]# curl shouji.liangjiawei.net
你访问的是手机的页面哦




#修改一下bbs的配置文件
[root@node-130 nginx]# vim  /data/nginx/conf/vhost/bbs.liangjiawei.net.conf 
server {
        listen 80;
        server_name bbs.liangjiawei.net;
        location / { 
                root /data/html/bbs/;
               index index.html index.htm;
        if ( $http_user_agent ~* "iphone|android" ) {			#这里主要用于判断用户的浏览器
                rewrite ^/(.*)$ http://shouji.liangjiawei.net/$1;
                }
                }
}

#重载nginx配置文件
[root@node-130 nginx]# nginx -s reload

正常浏览器访问

  • 访问到的是bbs的主页

如果选用手机

  • 浏览器
  • 按F12–>调出–>选择network–>ctrl+shift+M–》选择语言
实现不同浏览器的语言跳转实验
  • nginx会根据不同的浏览器语言来判断给用户提供什么资源
  • 主要涉及的是**$http_accept_language**
#修改bbs.liangjiawei.net的配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/bbs.liangjiawei.net.conf 
server {
        listen 80;
        server_name bbs.liangjiawei.net;
        location / {
                if ( $http_accept_language ~ "^zh-CN" ) {
                        rewrite ^/(.*) /zh/$1;
                        }
                if ( $http_accept_language ~ "^en" ) {
                        rewrite ^/(.*) /en/$1;
                        }
                root /data/html/bbs;
                index index.html index.htm;
                }
        location ^~ /zh/ {
                root /data/html/bbs/;
                index index.html index.htm;
                }
        location ^~ /en/ {
                root /data/html/bbs/;
                index index.html index.htm;
                }

}

#准备中文和英文的内容文件
[root@node-130 nginx]# mkdir -p /data/html/bbs/{zh,en}
[root@node-130 nginx]# echo "这是中文的页面" > /data/html/bbs/zh/index.html
[root@node-130 nginx]# echo "this is enenenenen " > /data/html/bbs/en/index.html


#重载配置文件验证
[root@node-130 nginx]# nginx -s reload
错误页面跳转会首页
  • 有些浏览器会直接劫持,然后跳转到它的页面
  • 这里需要注意一个状态码;200
  • 如果资源没有找到直接返回首页
#修改blog.liangjiawei.net的配置文件

[root@node-130 nginx]# vim /data/nginx/conf/vhost/blog.liangjiawei.net.conf 
server {
        listen 80;
        server_name blog.liangjiawei.net;
        location / {
                root /data/html/blog/;
               index index.html index.htm;		
                }
        error_page  404 http://blog.liangjiawei.net/index.html;#添加这一行

}

#重载配置文件后验证
[root@node-130 nginx]# nginx -s reload

浏览器验证