Day64-Nginx-Rewrite企业级应用讲解

1. 什么是Nginx Rewrite?

Nginx Rewrite的主要功能是实现对URL地址的重写,
Nginx的Rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配的,前文在安装Nginx软件时就已经安装了这个PCRE软件,以及让Nginx支持Rewrite的功能,默认参数编译Nginx就会安装支持Rewrite的模块,但是,也必须要PCRE软件的支持。
链接: https://www.cnblogs.com/LiuYanYGZ/p/5903946.html

Linux三剑客正则表达式,基本正则,扩展正则。
Perl兼容正则表达式相对复杂,开发人员需要会的正则。

[root@web01 ~]# rpm -qa pcre-devel
pcre-devel-8.32-17.el7.x86_64

2.Module ngx_http_rewrite_module

nginx rewrite模块
官方:nginx.org

2.1 if指令

Syntax:	if (condition) { ... }
Default:	—
Context:	server, location
~ 模糊匹配,区分大小写
~* 不区分大小写
!~不匹配
= 精确匹配

官方示例:

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}
# http://www.etiantian.org/index.php ==> http://www.etiantian.org/mise/index
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;   # $id=$1 赋值
}

if ($request_method = POST) {
    return 405;
}

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}

在这里插入图片描述

需求1:过滤请求nginx的URL中包含id=520的请求,转到172.16.1.7的80端口处理
理解if教学示例:

[root@lb01 conf.d]# cat 03_www.etiantian.org.conf
server {
	listen 80;
	server_name www.etiantian.org;
	root /data/www;
	location / {
		index index.html;
		# 如果请求的uri含有id=520,则执行proxy_pass的动作,否则什么都不管
		proxy_set_header Host $http_host;
		if ($request_uri ~* 'id=520') {
		proxy_pass http://172.16.1.7:80;
		}
	}
}


nginx -t
systemctl restart nginx

mkdir -p /data/www
echo "i am lb01" >/data/www/index.html

#测试:
[root@lb01 conf.d]# curl -H"host:www.etiantian.org" 172.16.1.5:80
i am lb01
[root@lb01 conf.d]# curl -H"host:www.etiantian.org" 172.16.1.5:80?id=520
web01
$args #这个变量等于请求行中的参数。
$content_length #请求头中的Content-length字段。
$content_type #请求头中的Content-Type字段。
$document_root #当前请求在root指令中指定的值。
$host #请求主机头字段,否则为服务器名称。
$http_user_agent #客户端agent信息
$http_cookie #客户端cookie信息
$limit_rate #这个变量可以限制连接速率。
$request_body_file #客户端请求主体信息的临时文件名。
$request_method #客户端请求的动作,通常为GET或POST。
$remote_addr #客户端的IP地址。
$remote_port #客户端的端口。
$remote_user #已经经过Auth Basic Module验证的用户名。
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string #与$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
$server_name #服务器名称。
$server_port #请求到达服务器的端口号。
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri #与$uri相同。
————————————————
链接:https://blog.csdn.net/qq_27517377/article/details/80813019

2.2 set定义变量

Syntax:	set $variable value;
Default:	—
Context:	server, location, if

需求2:将用户请求url.etiantian.org.zh跳转到url.etiantian.org/zh,将用户请求url.etiantian.org.en跳转url.etiantian.org/en
理解set教学示例:根据客户端浏览器请求头语言进行跳转。

[root@web01 ~]# cat /etc/nginx/conf.d/05_url.etiantian.org.conf 
server {
	listen 80;
	server_name url.etiantian.org.zh url.etiantian.org.en;
	
location / {
	set $lang zh;
	if ($http_host ~* "zh") {
		set $lang zh;
	}
	
	if ($http_host ~* "en"){
		set $lang en;
	}

	# 这个跳转会执行,lang这个变量是什么取决于用户请求的是什么域名
	rewrite ^/$ http://url.etiantian.org/$lang/ permanent;
}
}

server {
	listen 80;
	server_name url.etiantian.org;
	root /data/www;
	location / {
		index index.html;
	}
}
[root@web01 ~]# mkdir /data/www/zh -p
[root@web01 ~]# mkdir /data/www/en -p
[root@web01 ~]# echo "zh" > /data/www/zh/index.html
[root@web01 ~]# echo "en" > /data/www/en/index.html

nginx -t
systemctl restart nginx

[root@lb01 conf.d]# curl -H"host:url.etiantian.org" 172.16.1.5/zh/ #注意结尾斜线
zh
[root@lb01 conf.d]# curl -H"host:url.etiantian.org" 172.16.1.5/en/
en

windows hosts
10.0.0.5 url.etiantian.org.zh url.etiantian.org.en url.etiantian.org

浏览器测试:
http://url.etiantian.org.en/ 结果会跳转到http://url.etiantian.org/en/
http://url.etiantian.org.zh/ 结果会跳转到http://url.etiantian.org/zh/

2.3 return指令

Syntax:	
return code [text];
return code URL;
return URL;
Default:	—
Context:	server, location, if

return

[root@web01 ~]# cat /etc/nginx/conf.d/03_www.etiantian.org.conf
server {
	listen 80;
	server_name www.etiantian.org;
	root /data/www;
	location / {
		index index.html;
	}               
        default_type text/html;
        charset utf-8;
        if ($http_user_agent ~* "chrome|MSIE|firefox") {
		#return 200 '请更换浏览器\n';
		#return 520;
		return 301 http://www.oldboyedu.com;
	}
}


[root@lb01 conf.d]# curl -A "chrome" -H"host:www.etiantian.org" 172.16.1.5
请更换浏览器
[root@lb01 conf.d]# curl -H"host:www.etiantian.org" 172.16.1.5
i am lb01

链接: https://www.cnblogs.com/larry-luo/p/10119842.html

[root@web01 conf.d]# cat 02_www.etiantian.org.conf.0801test 
server {
	listen 80;
	server_name www.etiantian.org;
	root /data/www;
        charset utf-8;
[root@lb01 conf.d]# cat 03_www.etiantian.org.conf
server {
	listen 80;
	server_name www.etiantian.org;
	root /data/www;
        default_type text/html;
        charset utf-8;
       	location / {
		#index index.html;
         default_type text/html;
         return 200 "我是web01\n 
		 args: $args\n
			content_length: $content_length\n
			content_type: $content_type\n
			document_root: $document_root\n
			host: $host\n
			http_user_agent: $http_user_agent\n
			http_cookie: $http_cookie\n
			limit_rate: $limit_rate\n
			request_body_file: $request_body_file\n
			request_method: $request_method\n
			remote_addr: $remote_addr\n
			remote_port: $remote_port\n
			remote_user: $remote_user\n
			request_filename: $request_filename\n
			query_string: $query_string\n
			scheme: $scheme\n
			server_protocol: $server_protocol\n
			server_addr: $server_addr\n
			server_name: $server_name\n
			server_port: $server_port\n
			request_uri: $request_uri\n
			uri: $uri\n
			document_uri: $document_uri\n";
	}
}
[root@lb01 conf.d]# curl -A "chrome" -H"host:www.etiantian.org" 172.16.1.5/oldboy/
我是web01
     args: 

		content_length: 

		content_type: 

		document_root: /data/www

		host: www.etiantian.org

		http_user_agent: chrome

		http_cookie: 

		limit_rate: 0

		request_body_file: 

		request_method: GET

		remote_addr: 172.16.1.5

		remote_port: 6319

		remote_user: 

		request_filename: /data/www/oldboy/

		query_string: 

		scheme: http

		server_protocol: HTTP/1.1

		server_addr: 172.16.1.5

		server_name: www.etiantian.org

		server_port: 80

		request_uri: /oldboy/

		uri: /oldboy/

		document_uri: /oldboy/
		
[root@lb01 conf.d]# curl -A "chrome" -H"host:www.etiantian.org" 172.16.1.5/oldboy/

location ~ \.(php|jsp)$ {
   ddd
}

2.4 rewrite指令

指令语法:rewrite regex replacement [flag];
默认值:none
应用位置:server、location、if

rewrite regex replacement [flag];
关键字 正则 替代内容 flag标记

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement部分内容,结尾是flag标记。下面是一个简单的URL Rewrite跳转的例子:

rewrite ^/(.*) http://www.etiantian.org/$1 permanent;

在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,匹配所有,匹配成功后跳转到http://www.etiantian.org/$1,这里的$1是取前面regex部分()里的内容,结尾permanent;表示永久301重定向标记,即跳转到后面的http://www.etiantian.org/$1地址上。

regex常用正则表达式说明

字符 描述
\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。例如,“\n”匹配一个换行符,序列“\\”和“\ ”则匹配“ ”则匹配“ 则匹配
^ 匹配输入字符串的起始位置,如果设置Regxp对象的Multiline属性,^也匹配“\n”或“r”之后的位置
$ 匹配输入字符串的结束位置,如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置
* 匹配前面的字符零次或多次,例如,ol*能匹配“o”及“o111”,*等价于{0,}
+ 匹配前面的字符一次或多次,例如,“o1+”能匹配“o1”及“o11”但不能匹配“o”,.+等价于{1,}
? 匹配前面的的字符零次或一次,例如,“do(es)?”可以匹配“do”或”does“中的“do”.?等价于{0,1}
当该字符紧跟在任何一个其他限制符(*,+?,{n},{n},{n,m})后面时,匹配模式是非贪婪模式的,非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串,例如,对于字符串”oooo“,”o+?“将匹配单个“o”,而“o+”将匹配所有“o”
. 匹配除“\n”之外的任何单个字符,要匹配包括“\n”在内的任何字符,请使用像“[. \n]”的模式
(pattern) 匹配括号内pattern并可以在后面获取对应的匹配,常用用$0…$9属性获取小括号中的匹配内容。
要匹配圆括号字符,请使用“\(”或“)”

见书稿
链接: https://www.cnblogs.com/LiuYanYGZ/p/5903946.html

flag标记说明

flag标记符号 说明
last 本条规则匹配完成后,继续向下匹配新的location URI规则
break 本条规则匹配完成即终止,不再匹配后面的任何规则
redirect 返回302临时重定向, 地址栏会显示跳转后的地址
permanent 返回301永久重定向, 地址栏会显示跳转后的地址

break与last区别说明
last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{…}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配,不再匹配后面的规则。

当rewrite规则遇到break后,本location{}与其他location{}的所有rewrite/return规则都不再执行。
当rewrite规则遇到last后,本location{}里后续rewrite/return规则不执行,但重写后的url再次对其所在的server{…}标签重新发起请求,匹配哪个执行哪个。

有关rewrite特殊flag标记last与break的说明:
在根location(即location /{……})中或者server{……}标签中编写rewrite规则,建议使用last标记,而在普通的location(例location /oldboy/ {……}或if{}中编写rewrite规则,则建议使用break标记。

测试实践

echo "1.html" >/data/www/1.html
echo "2.html break" >/data/www/2.html
echo "3.html" >/data/www/3.html
echo "a.html last" >/data/www/a.html
echo "b.html" >/data/www/b.html

[root@web01]# cat www.etiantian.org.conf
server {
    listen 80;
    server_name www.etiantian.org;
    root /data/www;
location / {
    rewrite /1.html /2.html break;
    rewrite /2.html /3.html;
    }

location /2.html {
    rewrite /2.html /a.html;
    }

location /3.html {
    rewrite /3.html /b.html;
    }
}

测试结果: 当请求/1.html,最终会访问/2.html
因为:在location{}内部,遇到break,本location{}内以及后面的所有location{}内的所有指令都不再执行。

[root@web01]# cat www.etiantian.org.conf
server {
    listen 80;
    server_name www.etiantian.org;
    root /data/www;
location / {
    rewrite /1.html /2.html last;
    rewrite /2.html /3.html;
}

location /2.html {
    rewrite /2.html /a.html;
}

location /3.html {
    rewrite /3.html /b.html;
}
}

测试结果:当请求/1.html,最终会访问/a.html
因为:在location{}内部,遇到last,本location{}内后续指令不再执行
而重写后的url会对所在的server{…}标签重新发起请求,从头到尾匹配一遍规则,那个匹配则执行哪个。

nginx -t
systemctl restart nginx

rewrite案例:
需求3:实现访问http://blog.etiantian.org跳转到http://www.etiantian.org/blog/oldboy.html。
外部跳转时使用这种方法,浏览器地址会变为跳转后的地址,另外,要事先设置http://www.etiantian.org/blog/oldboy.html有结果输出,不然会出现401等权限错误。
(1)配置Nginx rewrite规则
跳转前http://url.etiantian.org对应站点的配置如下:

server {
        listen       80;
        server_name  blog.etiantian.org;
        if ( $http_host ~* "^(.*)\.etiantian\.org$") { 
           set $domain $1; 
           rewrite ^(.*) http://www.etiantian.org/$domain/oldboy.html break; 
          }
}
#要配置的规则内容为:
        if ( $http_host ~* "^(.*)\.etiantian\.org$") { 
           set $domain $1; 
           rewrite ^(.*) http://www.etiantian.org/$domain/oldboy.html break; 
          }

跳转后http://www.etiantian.org/blog/oldboy.html地址对应的站点配置如下:

[root@web01 conf.d]# cat 02_www.etiantian.org.conf
server {
	listen 80;
	server_name www.etiantian.org;
	root /data/www;
	location / {
	index index.html;
	}
}

mkdir /data/www/blog
echo "I am oldboy" >/data/www/blog/oldboy.html

nginx -t
systemctl restart nginx

[root@lb01 conf.d]# curl -H"host:www.etiantian.org" 172.16.1.5/blog/oldboy.html
I am oldboy

(2)客户端访问测试效果
Windows下浏览器访问跳转后的结果。

windows hosts
10.0.0.5 www.etiantian.org bbs.etiantian.org blog.etiantian.org

浏览器测试:
http://blog.etiantian.org

3. 企业级解决方案4:Nginx图片及目录防盗链解决方案

3.1 什么是资源盗链?

简单的说,就是某些不法的网站未经许可,通过在其自身网站程序里非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,达到填充自身网站的效果。这一举动不仅浪费了调用资源网站的网络流量,还造成其他网站的带宽及服务压力吃紧,甚至宕机。

资源被盗链原理详细示意图
在这里插入图片描述

3.2 网站资源被盗链带来的问题

若网站图片及相关资源被盗链,最直接的影响就是网络带宽占用加大了,带宽费用多了,网络流量也可能忽高忽低,nagios/zabbix 等报警服务频繁报警。最严重的情况就是网站的资源被非法使用,导致网站带宽成本加大和服务器压力加大有可能会导致数万元的损失,且网站的正常用户访问也会受到影响。

因盗链导致的流量飙升图
在这里插入图片描述

3.3 网站资源被盗链严重问题企业真实案例

某日,接到运维的朋友紧急求助,其公司的源站的流量没有变动,但CDN加速那边的带宽流量无故超了好几个GB,不知道怎么处理。
该故障的影响:由于是购买的CDN网站加速服务,因此虽然流量多了几个GB,但是业务未受影响。只是,这么大的异常流量,持续下去可直接导致公司无故损失数万元。解决这个问题可体现运维的价值。

那么这样的问题如何及时发现,又如何处理呢?
本节给大家讲述发现问题的几个方法,有关处理盗链,后文会详细讲解。
第一,对 IDC 及 CDN 带宽做监控报警
第二,作为高级运维或者运维经理,每天上班的一个重要任务,就是经常查看网站流量图,关注流量变化,关注异常流量。
第三,对访问日志做分析,对于异常流量迅速定位,并且和公司市场推广等有比较好的默契沟通,以便调度带宽和服务器资源。确保网站正常的访问体验得到保证。
更多企业案例,及实战解决方案见老男孩的博文链接: http://oldboy.blog.51cto.com/2561410/909696

3.4 常见防盗链解决方案的基本原理

3.4.1 根据 http referer 实现防盗链

在 HTTP 协议中,有一个表头字段叫 referer,使用URL格式来表示是哪里的链接用了当前网页的资源。通过 referer 可以检测目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来源不是本站,马上进行阻止或返回指定的页面。

HTTP Referer 是 header 的一部分,当浏览器向 Web 服务器发送请求的时候,一般会带上 Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。Apache、Nginx、Lighttpd三者都支持根据 http referer 实现防盜链 referer 是目前网站图片、附件、html 等最常用的防盗链手段。

referer防盗链的基本原理图
在这里插入图片描述

在这里插入图片描述

3.4.2 根据cookie防盗链

对于一些特殊的业务数据,例如流媒体应用以及通过Activex显示的内容(例如,Flash、Windows Media视频、流媒体的RTSP协议等),因为它们不向服务器提供Referer Header,所以若也采用上述的Referer的防盗链手段就达不到想要的效果。
对于Flash、Windows Media视频这种占用流量较大的业务数据实现防盗链是比较困难的,此时可以采用Cookie技术,来解决对Flash、Windows Media视频等的防盗链问题。

例如:ActiveX插件不传递Referer,但会传递Cookie。可以在显示 Activex 的页面的<head></head>标签内嵌入一段代码,实现用 JavaScript 代码来设置一段“Cookie:Cache=ay”

 <script> document.cookie="Cache=av;domain=domain.com;path=/";</script>

然后就可以通过各种手段来判断这个Cookie的存在以及验证其值的操作了
根据cookie防盗链技术非本书的内容,读者了解到上述内容即可,如果企业确实有需要,可以通过其他书籍或者进入交流群获取这部分的知识。

3.4.3 通过加密变换访问路径实现防盗链

此种方法比较适合视频以及下载类业务数据的网站。例如:Lighttpd有类似的插件mod secdownload来实现此功能,先在服务端配置此模块,设置一个固定用于加密的字符串,比如 oldboy,然后设置一个url前缀,比如/mp4/,再设置一个过期时间,比如1小时,然后写一段PHP代码,利用加密字符串和系统时间等通过md5算法生成一个加密字符串最终获取到的文件的URL链接中会带有一个时间戳和一个加密字符的md5数值,在访问时系统会对这两个数据进行验证。如果时间不在预期的时间段内(如1小时内)则失效;如果时间戳符合条件,但是加密的字符串不符合条件也失效,从而达到防盗链的效果。

3.5 案例实践

1)我们公司的网站
www.etiantian.org;

#Preventing hot linking of images and other file types
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
    valid_referers none blocked server_names *.etiantian.org etiantian.org;
    if ($invalid_referer) {
        rewrite ^/ http://bbs.etiantian.com/img/nolink.jpg;
    }

以根据自己的需求进行类似的设定。下面是对上述代码内容进行的说明:

  • “jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar”表示对以jpg、gif、png、swf、flv、wma、wmv、asf、mp3、mmf、zip和rar为后缀的文件实行防盗链处理。
  • “*.etiantian.org etiantian.org”表示这个请求可以正常访问上面指定的文件资源。
  • if{}中内容的意思是:如果地址不是上面指定的地址就跳转到通过rewrite指定的地址,也可以直接通过return返回403错误。
  • return 403 为自定义的http返回状态码。
  • rewrite ^/ http://www.etiantian.org/img/nolink.jpg;”表示显示一张防盗链图片。
  • access_log off;表示不记录访问日志,减轻压力
  • expires 3d 指的是所有文件3天的浏览器缓存

2)某公司盗链我公司的图片
www.daolian.com

3)返回显示盗链的图片地址
test.oldboy.com/img/nolink.jpg

公司网站配置:

server {
	listen 80;
	server_name www.etiantian.org;
	root /data/www;
    charset utf-8;
    default_type text/html;
	location / {
		index index.html;
	 }
     location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
		valid_referers none blocked server_names *.etiantian.org etiantian.org;
		if ($invalid_referer) {
			rewrite ^/ http://test.oldboy.com/img/nolink.jpg;
		}
     }
}
systemctl restart nginx
# 测试:
http://www.etiantian.org/jiangshengjie.jpg

某公司盗链我公司的图片
www.daolian.com

server {
        listen 80;
        server_name www.daolian.com;
        root /data/daolian;
        location / {
                index index.html;
        }
}
[root@lb01 conf.d]# mkdir /data/daolian
[root@lb01 conf.d]# cd /data/daolian
[root@lb01 daolian]# vim oldboy.html 
<html>
<head><title>老男孩Linux77期最牛</title></head>
<body>
<center>因为最牛,所以给个运维鼓励师<br><img src="http://www.etiantian.org/jiangshengjie.jpg" alt='鼓励师'></center>
  </body>
</html>
[root@lb01 daolian]# curl -H"host:www.daolian.com" 172.16.1.5/oldboy.html
<html>
<head><title>老男孩Linux77期最牛</title></head>
<body>
因为最牛,所以给个运维鼓励师:
<img src="http://www.etiantian.org/jiangshengjie.jpg" alt='鼓励师'>
</body>
</html>

浏览器配置hosts浏览:
http://www.daolian.com/oldboy.html

3)返回显示盗链的图片地址

test.oldboy.com/img/nolink.jpg
[root@lb01 conf.d]# mkdir /data/test

浏览器配置hosts浏览:
http://test.oldboy.com/img/nolink.jpg

[root@lb01 conf.d]# cat 06_daolian.conf 
#公司的网站
server {
	listen 80;
	server_name www.etiantian.org;
	root /data/www;
charset utf-8;
default_type text/html;
	location / {
		index index.html;
	}
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
		valid_referers none blocked server_names *.etiantian.org etiantian.org;
		if ($invalid_referer) {
			rewrite ^/ http://test.oldboy.com/img/nolink.jpg;
		}
     }
}

server {
        listen 80;
        server_name www.daolian.com;
        root /data/daolian;
        charset utf-8;
        location / {
                index index.html;
        }
}
server {
        listen 80;
        server_name test.oldboy.com;
        root /data/test;
        charset utf-8;
        location / {
                index index.html;
        }
}

需求5: 用户通过手机设备访问www.etiantian.org跳转至 m.etiantian.org
例:京东网站手机访问https://www.jd.com/跳转到https://m.jd.com

server {
    listen 80;
    server_name www.etiantian.org;
    root /code;
	location / {
		index index.html;
		if ($http_user_agent ~* "android|phone|iphone") {
			rewrite ^(.*)$ http://m.etiantian.org redirect;
		}
	}
}

需求6: 用户通过http协议请求,能自动跳转至https协议。

server {
    listen 80;
    server_name www.etiantian.org;
    rewrite ^(.*)$ https://$http_host$1;
    #return 301 https://$http_host$request_uri;
}

错误页面优雅显示
需求7: 当访问服务器遇到403 404 502等错误时,自动转到临时维护的静态页https://404.life/

当访问服务器遇到403 404 502等错误时
1.访问本地页面。
2.跳转URL地址。

server {
    listen 80;
    server_name url.etiantian.org;
    root /code;
    charset utf-8;
	location / {
		index index.html;
	}
	 # 接收返回的错误信息,定向到@error_status 
     #error_page 403 404 500 502 @error_status;
     error_page 403 404 500 502 http://www.etiantian.org;
     location @error_status {
     	rewrite ^(.*)$ /404.html break;
     }
}


[root@lb01 www]# cat 404.html 
<html>
<head><title>404</title></head>
<body>
<center><img src="404.jpg"></center>
</body>
</html>

error_page官方链接: http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page

相关推荐

  1. Day40-Rsync企业备份工具讲解

    2024-04-02 09:58:04       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-02 09:58:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-02 09:58:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-02 09:58:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-02 09:58:04       18 阅读

热门阅读

  1. MySQL数据库优化和MySQL故障

    2024-04-02 09:58:04       18 阅读
  2. AI技术创业有哪些机会?

    2024-04-02 09:58:04       24 阅读
  3. 计算机网络入门基础知识详解

    2024-04-02 09:58:04       20 阅读
  4. MySQL 数据库的优化

    2024-04-02 09:58:04       42 阅读
  5. Linux安装 nginx

    2024-04-02 09:58:04       23 阅读
  6. shell实现两台服务器的文件实时同步

    2024-04-02 09:58:04       19 阅读
  7. 什么是VPN服务器

    2024-04-02 09:58:04       15 阅读
  8. imu测试--UDP、PTP

    2024-04-02 09:58:04       16 阅读
  9. RUST 中什么情况下要使用 .unwrap ( )

    2024-04-02 09:58:04       16 阅读