WEB服务与NGINX(18)- nginx rewrite功能详解



1. nginx的rewrite功能详解

Nginx服务器利用ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regularexpression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程度上提高网站的安全性。

ngx_http_rewrite_module模块的官网文档:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html。

1.1 rewrite功能概述

  • rewrite使用场景

    • 1.地址跳转,用户访问www.nginx01.com这个URL时,将其定向至一个新的域名www.nginx02.com

    • 2.协议跳转,将用户通过http的请求协议重新跳转至https协议(实现https主要手段)。

    • 3.URL静态化,将动态URL地址显示为静态URL的一种技术,能提高搜索引擎抓取 并且能减少动态URL对外暴露过多的参数。PS:Rewrite会轻微增加服务器负担。

  • rewrite实现的原理,如下图所示:

image

1.2 rewrite模块的常用指令

1.2.1 if指令

支持环境:server, location

语法格式为:

if (条件匹配condition) {
    action;  
}

其中判断条件condition可以使用正则表达式对变量进行匹配,匹配成功时条件为true,执行action动作;否则为false,不执行action动作。变量和表达式之间可以使用以下符号连接,符号的意义如下:

符号 意义
= 比较变量和字符串是否相同,精确匹配。相同为true
!= 比较变量和字符串是否不相同,不相同为true
~ 模式匹配,支持正则表达式,区分字符大小写
~* 模式匹配,支持正则表达式,不区分字符大小写
!~ 模式不匹配,支持正则表达式,区分字符大小写
!~* 模式不匹配,支持正则表达式,不区分字符大小写
-f !-f 判断是否为文件并且存在
-d !-d 判断是否为目录并且存在
-x !-x 判断文件是否有执行权限
-e !-e 判断文件是否存在(包括文件,目录,软连接)
即只有一个变量名; 如果这个变量为空字符串或者”0”,则为false

if指令的使用示例如下:

#示例一:判断文件是否存在,实现http跳转https
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
server {
	listen 443 ssl;
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	ssl_certificate /etc/nginx/certs/xuzhichao.crt;
	ssl_certificate_key /etc/nginx/certs/xuzhichao.key;
	ssl_session_cache shared:ssl_cache:30m;
	ssl_session_timeout 10m;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
		if ( $scheme = http ) {            <==http跳转https
			rewrite / https://www.xuzhichao.com permanent;
		}
	}

	location /main {
		default_type text/html;
		if ( -f $request_filename ) {
			return 200 "file is exist!";
		}

		if ( !-f $request_filename ) {
			return 200 "file is not exist!";
		}
	}
}

#客户端测试:
[root@xuzhichao ~]# curl http://www.xuzhichao.com/main/index.html
file is not exist!

#示例二:使用正则表达式判断,配置文件main部分修改如下:
	location /main {
		default_type text/html;

		if ( $request_uri ~* 'id=\d{1,4}$' ) {
			return 200 "match";
		}
	}
#其中\d表示数字,{1,4}表示数字出现1-4次。

#客户端测试
[root@xuzhichao ~]# curl http://www.xuzhichao.com/main/?id=123
match
[root@xuzhichao ~]# curl http://www.xuzhichao.com/main/?id=123456
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

1.2.2 set指令

语法:set $variable value;

Context: server, location, if

功能:为变量赋值,value 可包含:文本,变量,或文本和变量的组合。

注意:变量定义和调用都要以$开头。

set指令使用示例如下:

需求:根据用户访问的URL跳转至指定的目录,用户访问http://www.xuzhichao.com.cn时跳转到www.xuzhichao.com/cn;用户访问http://www.xuzhichao.com.us时跳转到www.xuzhichao.com/us.

#1.nginx的配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
server {
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
	}
}

server {
	listen 80;
	server_name www.xuzhichao.com.cn www.xuzhichao.com.us;
	
	location / {
		if ( $host ~* "cn" ) {    <==  也可以根据浏览器支持的语言类型来判断:$http_accept_language	~*	"zh-CN|zh"
			set $language cn;
		}

		if ( $host ~* "us" ) {
			set $language us;
		}

		rewrite ^/$ http://www.xuzhichao.com/$language/ permanent;
	}
}

#2.建立相关的工作目录
[root@nginx01 ~]# cd /data/nginx/html/xuzhichao/
[root@nginx01 xuzhichao]# mkdir us
[root@nginx01 xuzhichao]# echo "<h1>US</h1>" > us/index.html
[root@nginx01 xuzhichao]# mkdir cn
[root@nginx01 xuzhichao]# echo "<h1>CHINA</h1>" > cn/index.html

#3.重启nginx
[root@nginx01 ~]# systemctl reload nginx.service 

#4.客户端测试,访问不同的域名跳转到不同的目录中。
[root@xuzhichao ~]# curl -L -i http://www.xuzhichao.com.cn
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 21 Jun 2021 11:05:49 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: http://www.xuzhichao.com/cn/

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 21 Jun 2021 11:05:49 GMT
Content-Type: text/html
Content-Length: 15
Last-Modified: Mon, 21 Jun 2021 11:03:27 GMT
Connection: keep-alive
ETag: "60d071ff-f"
Accept-Ranges: bytes

<h1>CHINA</h1>

[root@xuzhichao ~]# curl -L -i http://www.xuzhichao.com.us
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 21 Jun 2021 11:05:55 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: http://www.xuzhichao.com/us/

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 21 Jun 2021 11:05:55 GMT
Content-Type: text/html
Content-Length: 12
Last-Modified: Mon, 21 Jun 2021 11:03:13 GMT
Connection: keep-alive
ETag: "60d071f1-c"
Accept-Ranges: bytes

<h1>US</h1>

1.2.3 break指令

break用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的指令配置就不再生效了,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和location块以及if块中使用。

break的使用示例如下:

[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
server {
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
        set $name xuzhichao;
        echo $name;
        break;      <==break之后的此location语句中的内容将不再执行。
        set $name xuzhichao;
        echo $my_port;
	}
    
    location /test {   <==以下指定依旧会被执行
        set $sex man;
        echo $sex;
    }
}

1.2.4 return指令

从nginx版本0.8.2开始支持,return用于完成对请求的处理,并直接向客户端返回响应状态码,比如其可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if和location块进行配置。

常用语法格式为:

return code [text];   <==返回提示信息和状态码
return code URL;      <==返回提示信息和指定的URL,重定向
return URL;           <==指定的URL,重定向

使用示例如下:

#示例一:如果用户使用IE浏览器或curl访问,则返回提示字符串。
#nginx配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
server {
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
	}

	location /doc {
		if ( $http_user_agent ~* "curl|MSIE [1-6]\.") {
			return 200 "please change your agent!";
		}
	}
}

#客户端测试:
[root@xuzhichao ~]# curl http://www.xuzhichao.com/doc/
please change your agent!

#示例二:如果用户使用IE浏览器或curl访问,则跳转到/www.nginx01.com。
#nginx配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
server {
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
	}

	location /doc {
		if ( $http_user_agent ~* "curl|MSIE [1-6]\.") {
			return 302 http://www.nginx01.com;
		}
	}
}

#客户端测试:
[root@xuzhichao ~]# curl -L -i http://www.xuzhichao.com/doc/
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Mon, 21 Jun 2021 15:25:22 GMT
Content-Type: text/html
Content-Length: 138
Connection: keep-alive
Location: http://www.nginx01.com

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 21 Jun 2021 15:25:22 GMT
Content-Type: text/html; charset=utf-8,gbk
Content-Length: 16
Last-Modified: Wed, 16 Jun 2021 13:56:31 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "60ca030f-10"
Accept-Ranges: bytes

www.nginx01.com

1.2.5 rewrite_log指令

设置是否开启记录ngx_http_rewrite_module模块日志记录到error_log日志文件当中,可以配置在http、server、location或if当中,需要日志级别为notice。

使用示例如下:

[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
server {
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
        set $name xuzhichao;
        echo $name;
        rewrite_log on;
        break;      <==break之后的此location语句中的内容将不再执行。
        set $name xuzhichao;
        echo $my_port;
	}
}

1.3 rewite指令详解

rewrite通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理。      

  • URI(universal resource identifier):通用资源标识符,标识一个资源的路径,可以不带协议。   

  • URL(uniform resource location):统一资源定位符,是用于在Internet中描述资源的字符串,是URI的子集,主要包括传输协议(scheme)、主机(IP、端口号或者域名)和资源具体地址(目录和文件名)等三部分。

  • 每个URL都是一个URI,但是URI不都是URL,例如:

rewrite可以配置在server、location、if环境中,其语法格式为:     

rewrite regex replacement [flag];

rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI。   

rewrite匹配机制:

  • 如果在同一级配置块中存在多个rewrite规则,那么会自上而下逐个检查;被某条件规则替换完成后,会重新开始此配置块新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制。

  • 如果重写的URI不断循环匹配, 这个循环的次数不超过10次,超出后提示500响应码。

  • 永久重定向301

    如果replacement是以http://或https://开头,无论flag设置为什么,则替换结果会直接以重定向返回给客户端, 即永久重定向301。

其中flag有以下几个选项,意义如下:

  • last

    重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环,响应码为200,无需客户端参与,客户端请求的URI不会变化。默认规则。

    不建议在location中使用。

    例如:匹配规则有n条,用户请求来之后,检查第一条不匹配、第二条不匹配、…、第四条匹配了,后面的就不检查了。此时因为一重写已经成为了一个新的URL,这个新的URL会再次被重新发给Nginx服务器,Nginx 服务器一样会从第一条检查、第二条、…,如果检查第三条又被重写了,因此又一次改成新的URL再次发起请求从头到尾来检查。

  • break

    重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,无需客户端参与,客户端请求的URI不会变化。

    建议在location中使用。

  • redirect

    临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;使用相对路径,不能使用http://或https://开头,状态码:302

  • permanent

    重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码:301

1.3.1 临时重定向和永久重定向

  • 临时重定向和永久重定向的主要区别为:

    域名临时重定向,只是告诉浏览器不是固定重定向到当前目标域名,后期可能随时会更改,因此浏览器不会缓存当前域名的DNS解析记录;

    如果是永久重定向,浏览器会缓存当前域名的DNS解析记录。

  • 临时重定向示例:

    #将/images/临时重定向到/pictures/
    #1.nginx的配置文件如下
    [root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
    server {
    	listen 80;
    	server_name www.xuzhichao.com;
    	access_log /var/log/nginx/access_xuzhichao.log access_json;
        
    	location / {
    		root /data/nginx/html/xuzhichao;
    		index index.html;
    	}
    
    	location /images/ {
    		index index.html;
    		rewrite /images/(.*) /pictures/$1 redirect;
            #rewrite /images/(.*) http://www.xuzhichao.com/pictures/$1 redirect;  <==或这种写法
    	}
    }
    
    #2建立对应目录
    [root@nginx01 xuzhichao]# mkdir pictures
    [root@nginx01 xuzhichao]# echo "pictures page" > pictures/index.html
    
    #3.重启nginx服务
    [root@nginx01 ~]# systemctl reload nginx.service
    
    #4.客户端测试:
    [root@xuzhichao ~]# curl -L -i http://www.xuzhichao.com/images/
    HTTP/1.1 302 Moved Temporarily             <==提示为302临时重定向
    Server: nginx
    Date: Mon, 21 Jun 2021 16:17:01 GMT
    Content-Type: text/html
    Content-Length: 138
    Location: http://www.xuzhichao.com/pictures/
    Connection: keep-alive
    
    HTTP/1.1 200 OK
    Server: nginx
    Date: Mon, 21 Jun 2021 16:17:01 GMT
    Content-Type: text/html
    Content-Length: 14
    Last-Modified: Mon, 21 Jun 2021 16:15:16 GMT
    Connection: keep-alive
    ETag: "60d0bb14-e"
    Accept-Ranges: bytes
    
    pictures page
    
  • 永久重定向示例:

    #将/images/永久重定向到/pictures/
    #1.nginx的配置文件如下
    [root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
    server {
    	listen 80;
    	server_name www.xuzhichao.com;
    	access_log /var/log/nginx/access_xuzhichao.log access_json;
        
    	location / {
    		root /data/nginx/html/xuzhichao;
    		index index.html;
    	}
    
    	location /images/ {
    		index index.html;
    		rewrite /images/(.*) /pictures/$1 permanent;
            #rewrite /images/(.*) http://www.xuzhichao.com/pictures/$1 permanent;  <==或这种写法
    	}
    }
    
    #2.重启nginx服务
    [root@nginx01 ~]# systemctl reload nginx.service
    
    #3.客户端测试:
    [root@xuzhichao ~]# curl -L -i http://www.xuzhichao.com/images/
    HTTP/1.1 301 Moved Permanently                <==提示为301永久重定向
    Server: nginx
    Date: Mon, 21 Jun 2021 16:18:45 GMT
    Content-Type: text/html
    Content-Length: 162
    Location: http://www.xuzhichao.com/pictures/
    Connection: keep-alive
    
    HTTP/1.1 200 OK
    Server: nginx
    Date: Mon, 21 Jun 2021 16:18:45 GMT
    Content-Type: text/html
    Content-Length: 14
    Last-Modified: Mon, 21 Jun 2021 16:15:16 GMT
    Connection: keep-alive
    ETag: "60d0bb14-e"
    Accept-Ranges: bytes
    
    pictures page
    

1.3.2 break和last的使用区别

1.3.2.1 break使用案例

break匹配成功后,不会继续向下匹配,也不会跳转到其他的location进行匹配,而是结束匹配将结果返回给客户端。请看下面的示例:

#示例一:
#1.nginx的配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
server {
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
	}

	location /break {
		root /data/nginx/html/xuzhichao;
		index index.html;
		rewrite ^/break/(.*) /test1/$1 break;    <==本location之后的rewrite和return语句都不再执行,其他location的语句也不执行;
		rewrite ^/test1/(.*) /test2/$1 break;
		return 601 "break\n";
	}

	location /test1/ {
		root /data/nginx/html/xuzhichao;
		index index.html;
		return 888 "test1 dir!\n";
	}

	location /test2/ {
		root /data/nginx/html/xuzhichao;
		index index.html;
		return 889 "test2 dir!\n";
	}
}

#2.建立nginx工作目录
[root@nginx01 xuzhichao]# mkdir test1/
[root@nginx01 xuzhichao]# echo "test1 page" > test1/index.html
[root@nginx01 xuzhichao]# mkdir test2/
[root@nginx01 xuzhichao]# echo "test2 page" > test2/index.html
[root@nginx01 xuzhichao]# mkdir break/
[root@nginx01 xuzhichao]# echo "break page" > break/index.html

#3.重启nginx服务
[root@nginx01 ~]# systemctl reload nginx.service

#4.客户端测试:
#跟上index.html返回test1默认主页内容;
[root@xuzhichao ~]# curl -i http://www.xuzhichao.com/break/index.html
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 22 Jun 2021 02:25:48 GMT
Content-Type: text/html
Content-Length: 11
Last-Modified: Tue, 22 Jun 2021 01:35:07 GMT
Connection: keep-alive
ETag: "60d13e4b-b"
Accept-Ranges: bytes

test1 page

#注意:不加index.html返回状态码888,执行了location test1中的return语句。
[root@xuzhichao ~]# curl -i http://www.xuzhichao.com/break/
HTTP/1.1 888 
Server: nginx
Date: Tue, 22 Jun 2021 02:25:57 GMT
Content-Type: text/html
Content-Length: 10
Connection: keep-alive

test1 dir!

[root@xuzhichao ~]# curl -i http://www.xuzhichao.com/test1/
HTTP/1.1 888 
Server: nginx
Date: Tue, 22 Jun 2021 02:25:20 GMT
Content-Type: application/octet-stream
Content-Length: 10
Connection: keep-alive

test1 dir!


#示例二:
#1.nginx的配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
server {
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
	}

	location /break {
		root /data/nginx/html/xuzhichao;
		index index.html;
		rewrite ^/break/(.*)/ /test1/$1 break;    <==注意,在语句块中多加了一个/,则rewrite跳转失败。
		rewrite ^/test1/(.*)/ /test2/$1 break;
		return 601 "break\n";
	}

	location /test1/ {
		root /data/nginx/html/xuzhichao;
		index index.html;
		return 888 "test1 dir!\n";
	}

	location /test2/ {
		root /data/nginx/html/xuzhichao;
		index index.html;
		return 889 "test2 dir!\n";
	}
}

#2.重启nginx服务
[root@nginx01 ~]# systemctl reload nginx.service

#3.客户端测试:
[root@xuzhichao ~]# curl -i http://www.xuzhichao.com/break/
HTTP/1.1 601 
Server: nginx
Date: Tue, 22 Jun 2021 02:35:52 GMT
Content-Type: application/octet-stream
Content-Length: 5
Connection: keep-alive

break 

[root@xuzhichao ~]# curl -i http://www.xuzhichao.com/break/index.html
HTTP/1.1 601 
Server: nginx
Date: Tue, 22 Jun 2021 02:35:56 GMT
Content-Type: text/html
Content-Length: 5
Connection: keep-alive

break
1.3.2.2 last使用案例

last在某个location中匹配成功后,则当前location的后续rewrite和return语句都不执行,结束当前location,然后将匹配新生成的URL跳转到其他的location重新进行匹配,直到没有其他location可以匹配到为止,将最后一次location的数据返回给客户端。

#示例一:
#1.nginx配置文件:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
server {
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
	}

	location /last {
		root /data/nginx/html/xuzhichao;
		index index.html;
		rewrite ^/last/(.*) /test1/$1 last;     <==本location之后的rewrite和return语句都不再执行,会以新的URL重新进行匹配;
		rewrite ^/test1/(.*) /test2/$2 last;
	}

	location /test1/ {
		root /data/nginx/html/xuzhichao;
		index index.html;
		rewrite ^/test1/(.*) /test3/$1 last;
	}

	location /test2/ {
		root /data/nginx/html/xuzhichao;
		index index.html;
		return 889 "test2 dir!\n";
	}

	location /test3 {
		root /data/nginx/html/xuzhichao;
		index index.html;
		return 890 "test3 dir!\n";
	}
}

#2.新建nginx工作目录:
[root@nginx01 xuzhichao]# mkdir last
[root@nginx01 xuzhichao]# echo "<h1>last page</h1>" > last/index.html
[root@nginx01 xuzhichao]# mkdir test3
[root@nginx01 xuzhichao]# echo "<h1>test3 page</h1>" > test3/index.html

#3.客户端测试:
[root@xuzhichao ~]# curl -i http://www.xuzhichao.com/last/index.html
HTTP/1.1 890 
Server: nginx
Date: Tue, 22 Jun 2021 03:11:26 GMT
Content-Type: text/html
Content-Length: 11
Connection: keep-alive

test3 dir!

[root@xuzhichao ~]# curl -i http://www.xuzhichao.com/last/
HTTP/1.1 890 
Server: nginx
Date: Tue, 22 Jun 2021 03:11:30 GMT
Content-Type: application/octet-stream
Content-Length: 11
Connection: keep-alive

test3 dir!


#示例二:
#1.nginx配置文件:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
server {
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
	}

	location /last {
		root /data/nginx/html/xuzhichao;
		index index.html;
		rewrite ^/last/(.*)/ /test1/$1 last;     <==注意,在语句块中多加了一个/,则rewrite跳转失败。;
		rewrite ^/test1/(.*)/ /test2/$2 last;
	}

	location /test1/ {
		root /data/nginx/html/xuzhichao;
		index index.html;
		rewrite ^/test1/(.*) /test3/$1 last;
	}

	location /test2/ {
		root /data/nginx/html/xuzhichao;
		index index.html;
		return 889 "test2 dir!\n";
	}

	location /test3 {
		root /data/nginx/html/xuzhichao;
		index index.html;
		return 890 "test3 dir!\n";
	}
}

#2.客户端测试:
[root@xuzhichao ~]# curl -i http://www.xuzhichao.com/last/index.html
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 22 Jun 2021 03:16:36 GMT
Content-Type: text/html
Content-Length: 19
Last-Modified: Tue, 22 Jun 2021 03:05:05 GMT
Connection: keep-alive
ETag: "60d15361-13"
Accept-Ranges: bytes

<h1>last page</h1>

[root@xuzhichao ~]# curl -i http://www.xuzhichao.com/last/
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 22 Jun 2021 03:16:39 GMT
Content-Type: text/html
Content-Length: 19
Last-Modified: Tue, 22 Jun 2021 03:05:05 GMT
Connection: keep-alive
ETag: "60d15361-13"
Accept-Ranges: bytes

<h1>last page</h1>

1.4 rewrite生产案例

  • 若用户使用手机访问网站www.xuzhichao.com,则跳转到www.xuzhichao.com/mobile 或mobile.xuzhichao.com.

    [root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
    server	{				
        listen	80;
        server_name www.xuzhichao.com;
        root /data/nginx/html/xuzhichao;
    	access_log /var/log/nginx/access_xuzhichao.log access_json;
    				
        if	($http_user_agent ~* "android|iphone|ipad")	{
    		rewrite / /mobile;
            #rewrite / http://mobile.xuzhichao.com;
    	}
    }
    
  • 网站在维护过程中,只有指定IP192.168.20.7和192.168.500/24可以正常访问网页,其他用户访问的所有网页都重定向到一个维护页面。

    [root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
    server	{				
        listen	80;
        server_name www.xuzhichao.com;
        root /data/nginx/html/xuzhichao;
    	access_log /var/log/nginx/access_xuzhichao.log access_json;
    	
        set $ip 0;
        
        if ( $remote_addr = "192.168.20.7|192.168.500/24" ) {
            set $ip 1;
        }
        
        if ( $ip = 0 ) {
            rewrite ^(.*)$ /weihu.html break;
        } 
        
        location / {
            root /data/nginx/html/xuzhichao;
            index index.html;
        }
    }
    
  • 当服务器遇到502,403错误时,将用户访问跳转到维护页面

    [root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
    server	{				
        listen	80;
        server_name www.xuzhichao.com;
        root /data/nginx/html/xuzhichao;
    	access_log /var/log/nginx/access_xuzhichao.log access_json;
    	
        error_page 403 502 = @weihu;
        location @weihu {
            rewrite ^(.*)$ /weihu.html break;
        }
        
        location / {
            root /data/nginx/html/xuzhichao;
            index index.html;
        }
    }
    
  • nginx的stub状态页面,只允许公司的公网出口IP可以访问,其他IP访问全部返回500或跳转到网站首页。

    [root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
    server	{				
        listen	80;
        server_name www.xuzhichao.com;
        root /data/nginx/html/xuzhichao;
    	access_log /var/log/nginx/access_xuzhichao.log access_json;
        
        location / {
            root /data/nginx/html/xuzhichao;
            index index.html;
        }
        
        location /stub {
            set $ip 0;
            
            if ( $remote_addr = "192.168.20.7|192168.50.0/24") {
                set $ip 1;
            }
            
            if ( $ip = 0 ) {
                return 500;
                #rewrite /(.*)$ http://www.xuzhichao.com/ redirect;
            }
            
            stub_status;        
        }
    }
    
  • 当用户访问网站时输入了一个不存在资源页面,可以将用户重定向到网站首页。

    [root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf 
    server	{				
        listen	80;
        server_name www.xuzhichao.com;
        root /data/nginx/html/xuzhichao;
    	access_log /var/log/nginx/access_xuzhichao.log access_json;
        
        location / {
            root /data/nginx/html/xuzhichao;
            index index.html;
        }
        
        if ( !-f $request_filename ) {
            rewrite ^(.*)$  http://www.xuzhichao.com/ redirect;
            # return 404;
        }
    }
    
posted @ 2021-06-23 00:16  向往自由的独行者  阅读(1194)  评论(0编辑  收藏  举报