為nginx配置好看的錯(cuò)誤提示頁(yè)面
nginx默認(rèn)錯(cuò)誤頁(yè)面確實(shí)有些丑哈,leeader讓我換一個(gè)樣式 ,我就來(lái)嘍!
1 找異常頁(yè)
原始頁(yè)


nginx默認(rèn)錯(cuò)誤頁(yè)面確實(shí)有些丑哈,leeader讓我換一個(gè)樣式 ,我就來(lái)嘍!
我演示的html源文件放在文章末尾。
ant.design 網(wǎng)站有幾個(gè)設(shè)計(jì)的例子。也挺好可以借鑒。
https://ant.design/docs/spec/research-exception-cn
我在gitee上找的可以直接拿來(lái)用的好幾套模板
https://gitee.com/heibaike1/error-page

2 win上替換
找到nginx安裝路徑
如果是默認(rèn) 就在html目錄下替換原來(lái)的錯(cuò)誤頁(yè)面,
名字要和替換的頁(yè)面保持一致哦。

如果想要自定義html文件路徑,就在配置文件nginx.conf文件中修改。

3 再linux服務(wù)器上替換
其實(shí)再linux上替換基本和windows上替換差不多
我之所以單獨(dú)拉出來(lái),是因?yàn)槲以倥渲玫臅r(shí)候遇到了很多問(wèn)題。
通過(guò)find命令查找到nginx.conf配置文件的位置
find -name nginx.conf

到文件所在目錄 vim 編輯
vim nginx.conf
在配置文件的service大括號(hào)內(nèi),配置如下信息
error_page 404 500 502 503 504 /50x.html;
location =/50x.html {
root /etc/nginx/html;
}
error_page:是當(dāng)返回指定的狀態(tài)碼之后,返回到頁(yè)面。我這里配置了404,主要是為了便于測(cè)試配置是否成功。root:是配置要顯示的頁(yè)面的位置,這里配置上絕對(duì)路徑,我配置了一下相對(duì)路徑?jīng)]有生效。
保存退出 檢查是否有語(yǔ)法問(wèn)題
nginx -t
沒(méi)有問(wèn)題 則重啟nginx
nginx -s reload
4 不生效解決辦法
如果遇到配置之后沒(méi)有生效,可能是nginx配置文件中沒(méi)有開(kāi)啟
同樣是在nginx.conf 文件中配置
proxy_intercept_errors on;

保存退出 檢查是否有語(yǔ)法問(wèn)題
nginx -t
沒(méi)有問(wèn)題 則重啟nginx
nginx -s reload
配置這個(gè)的原因是,nginx認(rèn)為你的項(xiàng)目會(huì)對(duì)錯(cuò)誤頁(yè)面返回相應(yīng)的錯(cuò)誤提示頁(yè),因此這里不會(huì)返回特定的錯(cuò)誤頁(yè)面,上面命令就是開(kāi)啟nginx的錯(cuò)誤配置頁(yè)面。
一般來(lái)所,項(xiàng)目里返回特定的錯(cuò)誤提示頁(yè)是比較好的,因?yàn)橐话闱闆r下 nginx可能轉(zhuǎn)發(fā)多個(gè)不同的項(xiàng)目,可能會(huì)有差異。如果區(qū)別不大,或者沒(méi)有要求,可以使用這個(gè)方式利用nginx統(tǒng)一返回。
樣式顯示不正確
我的html頁(yè)面和css,js頁(yè)面是分離的。在本地是可以正常訪問(wèn)的,但是配置到服務(wù)器之后,可能是因?yàn)閔tml中是相對(duì)路徑引入css和js的問(wèn)題,導(dǎo)致找不到css和js。所以下面的源碼中,我干脆把css和js都放到了html中。
我到這里就配置完成了,如果你遇到了別的問(wèn)題可以評(píng)論留言哦。
6 錯(cuò)誤頁(yè)源碼
- 效果圖

- html源文件
<!DOCTYPE html>
<html>
<head>
<title data-react-helmet="true">HTTP 404 - SegmentFault</title>
<meta charset="utf-8">
<!-- <meta http-equiv="refresh" content="20;url='https://github.com/cloudResource/error-page'"> -->
<link rel="stylesheet" href="./main.css" rel="external nofollow" >
<style>
body,
html {
padding: 0;
margin: 0;
font-family: 'Quicksand', sans-serif;
font-weight: 400;
overflow: hidden;
}
.writing {
width: 320px;
height: 200px;
background-color: #3f3f3f;
border: 1px solid #bbbbbb;
border-radius: 6px 6px 4px 4px;
position: relative;
}
.writing .topbar{
position: absolute;
width: 100%;
height: 12px;
background-color: #f1f1f1;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.writing .topbar div{
height: 6px;
width: 6px;
border-radius: 50%;
margin: 3px;
float: left;
}
.writing .topbar div.green{
background-color: #60d060;
}
.writing .topbar div.red{
background-color: red;
}
.writing .topbar div.yellow{
background-color: #e6c015;
}
.writing .code {
padding: 15px;
}
.writing .code ul {
list-style: none;
margin: 0;
padding: 0;
}
.writing .code ul li {
background-color: #9e9e9e;
width: 0;
height: 7px;
border-radius: 6px;
margin: 10px 0;
}
.container {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
height: 100vh;
width: 100%;
-webkit-transition: -webkit-transform .5s;
transition: -webkit-transform .5s;
transition: transform .5s;
transition: transform .5s, -webkit-transform .5s;
}
.stack-container {
position: relative;
width: 420px;
height: 210px;
-webkit-transition: width 1s, height 1s;
transition: width 1s, height 1s;
}
.pokeup {
-webkit-transition: all .3s ease;
transition: all .3s ease;
}
.pokeup:hover {
-webkit-transform: translateY(-10px);
transform: translateY(-10px);
-webkit-transition: .3s ease;
transition: .3s ease;
}
.error {
width: 400px;
padding: 40px;
text-align: center;
}
.error h1 {
font-size: 125px;
padding: 0;
margin: 0;
font-weight: 700;
}
.error h2 {
margin: -30px 0 0 0;
padding: 0px;
font-size: 47px;
letter-spacing: 12px;
}
.perspec {
-webkit-perspective: 1000px;
perspective: 1000px;
}
.writeLine{
-webkit-animation: writeLine .4s linear forwards;
animation: writeLine .4s linear forwards;
}
.explode{
-webkit-animation: explode .5s ease-in-out forwards;
animation: explode .5s ease-in-out forwards;
}
.card {
-webkit-animation: tiltcard .5s ease-in-out 1s forwards;
animation: tiltcard .5s ease-in-out 1s forwards;
position: absolute;
}
@-webkit-keyframes tiltcard {
0% {
-webkit-transform: rotateY(0deg);
transform: rotateY(0deg);
}
100% {
-webkit-transform: rotateY(-30deg);
transform: rotateY(-30deg);
}
}
@keyframes tiltcard {
0% {
-webkit-transform: rotateY(0deg);
transform: rotateY(0deg);
}
100% {
-webkit-transform: rotateY(-30deg);
transform: rotateY(-30deg);
}
}
@-webkit-keyframes explode {
0% {
-webkit-transform: translate(0, 0) scale(1);
transform: translate(0, 0) scale(1);
}
100% {
-webkit-transform: translate(var(--spreaddist), var(--vertdist)) scale(var(--scaledist));
transform: translate(var(--spreaddist), var(--vertdist)) scale(var(--scaledist));
}
}
@keyframes explode {
0% {
-webkit-transform: translate(0, 0) scale(1);
transform: translate(0, 0) scale(1);
}
100% {
-webkit-transform: translate(var(--spreaddist), var(--vertdist)) scale(var(--scaledist));
transform: translate(var(--spreaddist), var(--vertdist)) scale(var(--scaledist));
}
}
@-webkit-keyframes writeLine {
0% {
width:0;
}
100% {
width: var(--linelength);
}
}
@keyframes writeLine {
0% {
width:0;
}
100% {
width: var(--linelength);
}
}
@media screen and (max-width: 1000px) {
.container {
-webkit-transform: scale(.85);
transform: scale(.85);
}
}
@media screen and (max-width: 850px) {
.container {
-webkit-transform: scale(.75);
transform: scale(.75);
}
}
@media screen and (max-width: 775px) {
.container {
-ms-flex-wrap: wrap-reverse;
flex-wrap: wrap-reverse;
-webkit-box-align: inherit;
-ms-flex-align: inherit;
align-items: inherit;
}
}
@media screen and (max-width: 370px) {
.container {
-webkit-transform: scale(.6);
transform: scale(.6);
}
}
</style>
</head>
<body>
<div class="container">
<div class="error">
<h2>服務(wù)器開(kāi)小差了,請(qǐng)稍后再試</h2>
<p>Ruh-roh, something just isn't right... Time to paw through your logs and get down and dirty in your
stack-trace;)</p>
</div>
<div class="stack-container">
<div class="card-container">
<div class="perspec" style="--spreaddist: 125px; --scaledist: .75; --vertdist: -25px;">
<div class="card">
<div class="writing">
<div class="topbar">
<div class="red"></div>
<div class="yellow"></div>
<div class="green"></div>
</div>
<div class="code">
<ul>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="card-container">
<div class="perspec" style="--spreaddist: 100px; --scaledist: .8; --vertdist: -20px;">
<div class="card">
<div class="writing">
<div class="topbar">
<div class="red"></div>
<div class="yellow"></div>
<div class="green"></div>
</div>
<div class="code">
<ul>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="card-container">
<div class="perspec" style="--spreaddist:75px; --scaledist: .85; --vertdist: -15px;">
<div class="card">
<div class="writing">
<div class="topbar">
<div class="red"></div>
<div class="yellow"></div>
<div class="green"></div>
</div>
<div class="code">
<ul>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="card-container">
<div class="perspec" style="--spreaddist: 50px; --scaledist: .9; --vertdist: -10px;">
<div class="card">
<div class="writing">
<div class="topbar">
<div class="red"></div>
<div class="yellow"></div>
<div class="green"></div>
</div>
<div class="code">
<ul>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="card-container">
<div class="perspec" style="--spreaddist: 25px; --scaledist: .95; --vertdist: -5px;">
<div class="card">
<div class="writing">
<div class="topbar">
<div class="red"></div>
<div class="yellow"></div>
<div class="green"></div>
</div>
<div class="code">
<ul>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="card-container">
<div class="perspec" style="--spreaddist: 0px; --scaledist: 1; --vertdist: 0px;">
<div class="card">
<div class="writing">
<div class="topbar">
<div class="red"></div>
<div class="yellow"></div>
<div class="green"></div>
</div>
<div class="code">
<ul>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script >
const stackContainer = document.querySelector('.stack-container');
const cardNodes = document.querySelectorAll('.card-container');
const perspecNodes = document.querySelectorAll('.perspec');
const perspec = document.querySelector('.perspec');
const card = document.querySelector('.card');
let counter = stackContainer.children.length;
//function to generate random number
function randomIntFromInterval(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
//after tilt animation, fire the explode animation
card.addEventListener('animationend', function () {
perspecNodes.forEach(function (elem, index) {
elem.classList.add('explode');
});
});
//after explode animation do a bunch of stuff
perspec.addEventListener('animationend', function (e) {
if (e.animationName === 'explode') {
cardNodes.forEach(function (elem, index) {
//add hover animation class
elem.classList.add('pokeup');
//add event listner to throw card on click
elem.addEventListener('click', function () {
let updown = [800, -800]
let randomY = updown[Math.floor(Math.random() * updown.length)];
let randomX = Math.floor(Math.random() * 1000) - 1000;
elem.style.transform = `translate(${randomX}px, ${randomY}px) rotate(-540deg)`
elem.style.transition = "transform 1s ease, opacity 2s";
elem.style.opacity = "0";
counter--;
if (counter === 0) {
stackContainer.style.width = "0";
stackContainer.style.height = "0";
}
});
//generate random number of lines of code between 4 and 10 and add to each card
let numLines = randomIntFromInterval(5, 10);
//loop through the lines and add them to the DOM
for (let index = 0; index < numLines; index++) {
let lineLength = randomIntFromInterval(25, 97);
var node = document.createElement("li");
node.classList.add('node-' + index);
elem.querySelector('.code ul').appendChild(node).setAttribute('style', '--linelength: ' + lineLength + '%;');
//draw lines of code 1 by 1
if (index == 0) {
elem.querySelector('.code ul .node-' + index).classList.add('writeLine');
} else {
elem.querySelector('.code ul .node-' + (index - 1)).addEventListener('animationend', function (e) {
elem.querySelector('.code ul .node-' + index).classList.add('writeLine');
});
}
}
});
}
});
</script>
</html>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
nginx+uwsgi啟動(dòng)Django項(xiàng)目的詳細(xì)步驟
nginx+uwsgi+django是我們常用的django部署方式。這篇文章主要介紹了nginx+uwsgi啟動(dòng)Django項(xiàng)目的詳細(xì)步驟,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
Ubuntu使用nginx搭建webdav文件服務(wù)器的詳細(xì)過(guò)程
今天通過(guò)本文給大家分享Ubuntu使用nginx搭建webdav文件服務(wù)器的詳細(xì)過(guò)程,在這小編提示大家在安裝nginx時(shí)需要先安裝nginx-full,具體安裝方法跟隨小編一起通過(guò)本文學(xué)習(xí)下吧2021-05-05
Nginx使用ngx_http_upstream_module實(shí)現(xiàn)負(fù)載均衡功能示例
本文主要介紹了Nginx使用ngx_http_upstream_module實(shí)現(xiàn)負(fù)載均衡功能示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

