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实现的原理,如下图所示:
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,例如:
- http://example.org/path/to/resource.txt #URI/URL
- ftp://example.org/resource.txt #URI/URL
- /absolute/path/to/resource.txt #URI
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; } }