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;
}
}
WEB服务与NGINX(18)- nginx rewrite功能详解的更多相关文章
- Nginx(四):压缩功能详解
gzip (GNU-ZIP) 是一种压缩技术.经过 gzip 压缩后页面大小可以变为原来的 30%甚至更小. 这样,用户浏览页面的时候速度会快得多. gzip 的压缩页面需要浏览器和服务器双方都支持 ...
- Nginx各个配置块功能详解
Nginx学习笔记-入门篇 nginx初探 ginx服务器是轻量级web服务器中广受好评的一款产品,常用功能有HTTP代理与反向代理(目前已支持七层与四层代理),负载均衡,web缓存. nginx配置 ...
- 开启Nginx的gzip压缩功能详解
默认情况下,Nginx的gzip压缩是关闭的, gzip压缩功能就是可以让你节省不少带宽,但是会增加服务器CPU的开销哦,Nginx默认只对text/html进行压缩 ,如果要对html之外的内容进行 ...
- Nginx网络架构实战学习笔记(一):Nginx简介、安装、信号控制、nginx虚拟主机配置、日志管理、location 语法、Rewrite语法详解
文章目录 nginx简介 nginx安装 nginx信号控制 nginx虚拟主机配置 日志管理 location 语法 精准匹配的一般匹配 正则匹配 总结 Rewrite语法详解 nginx简介 Ng ...
- Nginx 常用全局变量 及Rewrite规则详解
每次都很容易忘记Nginx的变量,下面列出来了一些常用 $remote_addr //获取客户端ip $binary_remote_addr //客户端ip(二进制) $remote_port //客 ...
- Nginx的介绍和安装详解
[介绍+安装]Nginx的介绍和安装详解 == 介绍和安装 == Nginx是一个自由.开源.高性能及轻量级的HTTP服务器及反转代理服务器, 其性能与IMAP/POP3代理服务器相当.Nginx ...
- Nginx核心配置文件常用参数详解
Nginx核心配置文件常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于Nginx权威文档的话童鞋们可以参考Nginx官方文档介绍:http://nginx.org/ ...
- 【转】Nginx+php-fpm+MySQL分离部署详解
转:http://www.linuxidc.com/Linux/2015-07/120580.htm Nginx+php-fpm+MySQL分离部署详解 [日期:2015-07-26] 来源:Linu ...
- Nginx RTMP 模块 nginx-rtmp-module 指令详解
译序:截至 Jul 8th,2013 官方公布的最新 Nginx RTMP 模块 nginx-rtmp-module 指令详解.指令Corertmp语法:rtmp { ... }上下文:根描述:保存所 ...
- [转帖]Nginx的超时keeplive_timeout配置详解
Nginx的超时keeplive_timeout配置详解 https://blog.csdn.net/weixin_42350212/article/details/81123932 Nginx ...
随机推荐
- SqlServer的实用且高级玩法.md
1.常见表表达式(CTEs) 如果您想要查询子查询,那就是CTEs施展身手的时候 - CTEs基本上创建了一个临时表. 使用常用表表达式(CTEs)是模块化和分解代码的好方法,与您将文章分解为几个段落 ...
- Jetpack Compose(4)——重组
目录 一.状态变化 1.1 状态变化是什么 1.2 mutableStateListOf 和 mutableStateMapOf 二.重组的特性 2.1 Composable 重组是智能的 2.2 C ...
- 详解SSL证书系列(10)SSL的加密算法
HTTPS协议的主要功能依赖于SSL,SSL全称为安全套接层(Secure Socket Layer). SSL的功能主要依赖于三类加密算法,散列函数,对称加密和非对称加密. HASH算法 HAS ...
- openGauss/MOGDB时间消耗相关视图
openGauss/MOGDB 时间消耗相关视图 本文出处:https://www.modb.pro/db/388212 数据库版本 openGauss/MOGDB-2.1.1 一.显示当前用户在各个 ...
- HDC2021技术分论坛:ArkUI 3.0让多设备开发更简单!
作者:wanglei,华为UI编程框架技术专家 HarmonyOS自诞生以来,就是为满足分布式多设备应用场景而设计的,大到智慧屏.车机.平板,小到手机.手表.在多设备场景下进行应用UI界面开发,面临新 ...
- 深入理解DES算法:原理、实现与应用
title: 深入理解DES算法:原理.实现与应用 date: 2024/4/14 21:30:21 updated: 2024/4/14 21:30:21 tags: DES加密 对称加密 分组密码 ...
- input 去除默认样式
前言 如何不自己写框架,基本用不上. 正文 input{ border: 0px; background-color: none; outline: none; } input:focus{ outl ...
- Oracle 存储包死锁杀进程操作
Oracle 存储包死锁杀进程操作 突然想起来,正好记一份 首先查询锁包的情况 select distinct session_id from dba_ddl_locks where name=upp ...
- 力扣977(Java)-有序数组的平方(简单)
题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: 输入:nums = [-4,-1,0,3,10]输出:[0,1, ...
- 力扣1097(MySQL)-游戏玩法分析Ⅴ(困难)
题目: 我们将玩家的安装日期定义为该玩家的第一个登录日. 我们还将某个日期 X 的第 1 天留存时间定义为安装日期为 X 的玩家的数量,他们在 X 之后的一天重新登录,除以安装日期为 X 的玩家的数量 ...