Files

685 lines
18 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<!-- 雷池 SafeLine · 自定义错误页 · 404 页面不存在(单文件自包含,无外部依赖) -->
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="robots" content="noindex" />
<title>404 · 页面不存在 — 雷池 SafeLine</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='7' fill='%23e3676d'/%3E%3Cpath d='M5.6 5.6l4.8 4.8M10.4 5.6l-4.8 4.8' stroke='%23e3dede' stroke-width='1.7' stroke-linecap='round'/%3E%3C/svg%3E" />
<style>
/* ===== 页面底衬 ===== */
html {
height: 100%;
}
body {
box-sizing: border-box;
margin: 0;
min-height: 100vh;
min-height: 100svh;
display: grid;
place-items: center;
padding: 3em 1.5em;
background-color: #0E69C8;
background-image: radial-gradient(rgba(255, 255, 255, 0.14) 1px, transparent 1.6px);
background-size: 26px 26px;
}
/* ===== 错误卡片 ===== */
#errorPage {
width: 22.5em;
min-height: 15em;
--backColor: rgb(227, 222, 222);
--firstColor: rgb(227, 103, 109);
--textColor: rgb(70, 68, 68);
border-radius: 1em;
position: relative;
font-family: Calibri, "Trebuchet MS", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
z-index: 1;
color: var(--textColor);
transform: rotate(3deg) skewX(3deg);
transition: all 0.25s ease-in-out;
}
#errorPage:hover {
transform: rotate(0deg) skewX(0deg);
}
#errorPage:hover #errorPage_Page {
transform: rotate(0deg) skewX(0deg);
box-shadow: -0.5em 0em var(--textColor);
}
#errorPage_Page svg {
transition: all 0.25s ease-in-out;
transform: rotate(0deg) skewX(3deg);
margin-top: 0.5em;
}
#errorPage:hover #errorPage_Page svg {
transform: rotate(-90deg) skewX(0deg);
}
#errorPage:hover #errorPage_BarSite {
transform: rotate(0deg) skewX(0deg);
box-shadow: -0.5em 0em var(--textColor);
}
#errorPage_Bar {
width: 100%;
height: 2em;
padding-left: 1.5em;
position: relative;
z-index: 3;
}
#errorPage_BarSite {
background-color: var(--backColor);
width: 5.5em;
height: 100%;
border-top-left-radius: 1em;
border-top-right-radius: 1em;
display: flex;
align-items: center;
color: var(--textColor);
padding-left: 0.5em;
box-shadow: -0.5em 0.25em var(--textColor);
transition: all 0.25s ease-in-out;
position: relative;
z-index: 1;
}
.errorPage_BarIcon {
width: 1em;
height: 1em;
background-color: var(--firstColor);
display: flex;
justify-content: center;
align-items: center;
border-radius: 1em;
}
.errorPage_BarIcon p {
font-size: 0.625em;
font-weight: bold;
margin: 0;
}
#errorPage_BarSiteText {
font-size: 0.78125em;
font-weight: bold;
padding-left: 0.5em;
margin: 0;
}
#errorPage_Page {
width: 100%;
min-height: 13em;
background: linear-gradient(var(--backColor), rgb(205, 200, 200));
border-radius: 1em;
box-shadow: -0.5em 0.5em var(--textColor);
display: flex;
flex-direction: column;
align-items: center;
padding-top: 0.5em;
padding-bottom: 1.05em;
transition: all 0.25s ease-in-out;
position: relative;
z-index: 3;
}
#errorPage_PageSearch {
width: 21.5em;
height: 1.25em;
border-radius: 10em;
background-color: var(--firstColor);
display: flex;
align-items: center;
padding-left: 0.5em;
}
.errorPage_PageText {
text-align: center;
font-size: 0.875em;
margin: 0;
padding: 0 1.1em;
}
.errorPage_PageText:nth-child(3) {
font-weight: bold;
font-size: 1.09375em;
margin-top: 0.8em;
padding: 0 0.9em;
}
.errorPage_PageText:nth-child(4) {
margin-top: 0.42em;
}
/* ===== 拦截信息(WAF 注入 event_id 时自动显示) ===== */
#errorPage_PageMeta {
display: none;
width: 82%;
margin-top: 0.9em;
padding-top: 0.55em;
border-top: 1px dashed rgba(70, 68, 68, 0.28);
font-size: 0.6875em;
line-height: 1.6;
color: rgba(70, 68, 68, 0.72);
text-align: center;
word-break: break-all;
}
.errorPage_PageSearchB {
width: 0.75em;
height: 0.75em;
border-radius: 10em;
margin-right: 0.5em;
}
.errorPage_PageSearchB:nth-child(1) {
animation: Ball1 10s linear infinite;
}
.errorPage_PageSearchB:nth-child(2) {
animation: Ball2 10s linear infinite;
}
.errorPage_PageSearchB:nth-child(3) {
animation: Ball3 10s linear infinite;
}
.errorPage_PageSearchB:nth-child(4) {
animation: Ball4 10s linear infinite;
}
.errorPage_PageSearchB:nth-child(5) {
animation: Ball5 10s linear infinite;
}
.errorPage_PageSearchB:nth-child(6) {
animation: Ball6 10s linear infinite;
}
.errorPage_PageSearchB:nth-child(7) {
animation: Ball7 10s linear infinite;
}
.errorPage_PageSearchB:nth-child(8) {
animation: Ball8 10s linear infinite;
}
@keyframes Ball1 {
0% {
background-color: var(--backColor);
}
2.5% {
background-color: var(--textColor);
}
97.5% {
background-color: var(--textColor);
}
100% {
background-color: var(--backColor);
}
}
@keyframes Ball2 {
0% {
background-color: var(--firstColor);
}
2.5% {
background-color: var(--backColor);
}
5% {
background-color: var(--textColor);
}
7.5% {
background-color: var(--textColor);
}
95% {
background-color: var(--textColor);
}
100% {
background-color: var(--firstColor);
}
}
@keyframes Ball3 {
0% {
background-color: var(--firstColor);
}
2.5% {
background-color: var(--firstColor);
}
5% {
background-color: var(--backColor);
}
7.5% {
background-color: var(--textColor);
}
10% {
background-color: var(--textColor);
}
92.5% {
background-color: var(--textColor);
}
95% {
background-color: var(--firstColor);
}
100% {
background-color: var(--firstColor);
}
}
@keyframes Ball4 {
0% {
background-color: var(--firstColor);
}
5% {
background-color: var(--firstColor);
}
7.5% {
background-color: var(--backColor);
}
10% {
background-color: var(--textColor);
}
12.5% {
background-color: var(--textColor);
}
60% {
background-color: var(--textColor);
}
62.5% {
background-color: var(--firstColor);
}
65% {
background-color: var(--backColor);
}
67.5% {
background-color: var(--textColor);
}
90% {
background-color: var(--textColor);
}
92.5% {
background-color: var(--firstColor);
}
100% {
background-color: var(--firstColor);
}
}
@keyframes Ball5 {
0% {
background-color: var(--firstColor);
}
7.5% {
background-color: var(--firstColor);
}
10% {
background-color: var(--backColor);
}
12.5% {
background-color: var(--textColor);
}
15% {
background-color: var(--textColor);
}
57.5% {
background-color: var(--textColor);
}
60% {
background-color: var(--firstColor);
}
65% {
background-color: var(--firstColor);
}
67.5% {
background-color: var(--backColor);
}
70% {
background-color: var(--textColor);
}
87.5% {
background-color: var(--textColor);
}
90% {
background-color: var(--firstColor);
}
100% {
background-color: var(--firstColor);
}
}
@keyframes Ball6 {
0% {
background-color: var(--firstColor);
}
10% {
background-color: var(--firstColor);
}
12.5% {
background-color: var(--backColor);
}
15% {
background-color: var(--textColor);
}
17.5% {
background-color: var(--firstColor);
}
20% {
background-color: var(--backColor);
}
22.5% {
background-color: var(--textColor);
}
55% {
background-color: var(--textColor);
}
57.5% {
background-color: var(--firstColor);
}
67.5% {
background-color: var(--firstColor);
}
70% {
background-color: var(--backColor);
}
72.5% {
background-color: var(--textColor);
}
85% {
background-color: var(--textColor);
}
87.5% {
background-color: var(--firstColor);
}
100% {
background-color: var(--firstColor);
}
}
@keyframes Ball7 {
0% {
background-color: var(--firstColor);
}
20% {
background-color: var(--firstColor);
}
22.5% {
background-color: var(--backColor);
}
25% {
background-color: var(--textColor);
}
27.5% {
background-color: var(--firstColor);
}
30% {
background-color: var(--backColor);
}
32.5% {
background-color: var(--textColor);
}
52.5% {
background-color: var(--textColor);
}
55% {
background-color: var(--firstColor);
}
70% {
background-color: var(--firstColor);
}
72.5% {
background-color: var(--backColor);
}
75% {
background-color: var(--textColor);
}
77.5% {
background-color: var(--firstColor);
}
80% {
background-color: var(--backColor);
}
82.5% {
background-color: var(--textColor);
}
85% {
background-color: var(--firstColor);
}
100% {
background-color: var(--firstColor);
}
}
@keyframes Ball8 {
0% {
background-color: var(--firstColor);
}
30% {
background-color: var(--firstColor);
}
32.5% {
background-color: var(--backColor);
}
35% {
background-color: var(--textColor);
}
40% {
background-color: var(--textColor);
}
42.5% {
background-color: var(--firstColor);
}
45% {
background-color: var(--backColor);
}
47.5% {
background-color: var(--textColor);
}
50% {
background-color: var(--textColor);
}
52.5% {
background-color: var(--firstColor);
}
100% {
background-color: var(--firstColor);
}
}
/* ===== 响应式 ===== */
@media (max-width: 430px) {
body {
padding: 2em 1em;
}
#errorPage {
font-size: 14px;
}
}
@media (max-width: 350px) {
body {
padding: 1.5em 0.6em;
}
#errorPage {
font-size: 12px;
}
}
/* ===== 降低动态效果 ===== */
@media (prefers-reduced-motion: reduce) {
#errorPage,
#errorPage_Page,
#errorPage_BarSite,
#errorPage_Page svg {
transition: none;
}
#errorPage:hover {
transform: rotate(3deg) skewX(3deg);
}
#errorPage:hover #errorPage_Page {
transform: none;
box-shadow: -0.5em 0.5em var(--textColor);
}
#errorPage:hover #errorPage_BarSite {
transform: none;
box-shadow: -0.5em 0.25em var(--textColor);
}
#errorPage:hover #errorPage_Page svg {
transform: rotate(0deg) skewX(3deg);
}
}
</style>
</head>
<body>
<div id="errorPage">
<div id="errorPage_Bar">
<div id="errorPage_BarSite">
<div class="errorPage_BarIcon"><p>X</p></div>
<p id="errorPage_BarSiteText">Error 404</p>
</div>
</div>
<div id="errorPage_Page">
<div id="errorPage_PageSearch">
<div class="errorPage_PageSearchB"></div>
<div class="errorPage_PageSearchB"></div>
<div class="errorPage_PageSearchB"></div>
<div class="errorPage_PageSearchB"></div>
<div class="errorPage_PageSearchB"></div>
<div class="errorPage_PageSearchB"></div>
<div class="errorPage_PageSearchB"></div>
<div class="errorPage_PageSearchB"></div>
</div>
<svg
width="100px"
height="110px"
viewBox="0 0 1024 1024"
class="icon"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
fill="#000000"
aria-hidden="true"
>
<g id="SVGRepo_bgCarrier" stroke-width="0"></g>
<g
id="SVGRepo_tracerCarrier"
stroke-linecap="round"
stroke-linejoin="round"
></g>
<g id="SVGRepo_iconCarrier">
<path
d="M798 193l-49-13 49-14 13-48 13 48 48 14-48 13-13 48-13-48zM845 245l-19-4 19-4 5-19 4 19 19 4-19 4-4 19-5-19z"
fill="#e3676d"
></path>
<path
d="M180 191m-9 0a9 9 0 1 0 18 0 9 9 0 1 0-18 0Z"
fill="#464444"
></path>
<path
d="M197 835l-32-8 32-7 8-33 7 33 33 7-33 8-7 32-8-32zM98 665l-14-3 14-3 4-15 3 15 15 3-15 3-3 15-4-15z"
fill="#e3676d"
></path>
<path
d="M832 856a25 25 0 1 1 25-25 25 25 0 0 1-25 25z m0-36a10 10 0 1 0 10 10 10 10 0 0 0-10-9z"
fill="#464444"
></path>
<path
d="M514 490m-52 0a52 52 0 1 0 104 0 52 52 0 1 0-104 0Z"
fill="#e3676d"
></path>
<path
d="M771 533a10 10 0 0 1 10-10h78a349 349 0 0 0-346-347 10 10 0 0 1 7 10v81a10 10 0 1 1-20 0v-81a10 10 0 0 1 7-10 349 349 0 0 0-346 348h84a10 10 0 0 1 0 20h-84c4 86 40 167 102 228a347 347 0 0 0 237 101v-75a10 10 0 0 1 20 0v75a347 347 0 0 0 237-102c62-61 97-142 102-228h-78a10 10 0 0 1-10-10zM513 759c-126 0-227-102-227-227s101-228 227-228 227 102 227 228-102 227-227 227z"
fill="#e3676d"
></path>
<path
d="M850 381a369 369 0 1 0 29 143 367 367 0 0 0-29-143z m-93 390a347 347 0 0 1-237 102v-75a10 10 0 0 0-20 0v76a347 347 0 0 1-237-103c-62-62-97-142-102-228h83a10 10 0 0 0 0-20h-83a349 349 0 0 1 346-347 10 10 0 0 0-7 10v81a10 10 0 1 0 20 0v-81a10 10 0 0 0-7-10 349 349 0 0 1 346 347h-78a10 10 0 0 0 0 20h77c-4 86-40 167-101 228z"
fill="#464444"
></path>
<path
d="M513 304c-126 0-227 102-227 227s101 228 227 228 227-101 227-227-102-228-227-228z m126 354a10 10 0 0 1-7 3h-5l-163-91h-1a10 10 0 0 1-6-5l-72-148a10 10 0 0 1 14-13l145 80 3 3 3 3 91 155a10 10 0 0 1-2 13z"
fill="#e3dede"
></path>
<path d="M417 437l52 106 52-48-104-58z" fill="#e3676d"></path>
<path d="M486 559l119 66-67-114-52 48z" fill="#e3676d"></path>
<path
d="M550 490l-3-3-3-3-145-80a10 10 0 0 0-14 13l72 147a10 10 0 0 0 6 5h1l163 90h5a10 10 0 0 0 9-15z m-133-53l105 58-52 48z m69 122l53-48 66 113z"
fill="#464444"
></path>
</g>
</svg>
<p class="errorPage_PageText">路径或许断了,但旅程还在。让我们带你回去。</p>
<p class="errorPage_PageText">The path may be broken, but the journey isn't. Let's get you back.</p>
<div id="errorPage_PageMeta">
<div id="errorPage_EventID"></div>
<div id="errorPage_TypeTime"></div>
</div>
</div>
</div>
<script>
(function () {
function findInjected() {
var i;
var list;
var n;
for (n = document.documentElement.nextSibling; n; n = n.nextSibling) {
if (n.nodeType === 8 && n.data.indexOf("event_id:") !== -1) return n.data;
}
list = document.body ? document.body.childNodes : [];
for (i = list.length - 1; i >= 0; i--) {
if (list[i].nodeType === 8 && list[i].data.indexOf("event_id:") !== -1) return list[i].data;
}
list = document.childNodes;
for (i = list.length - 1; i >= 0; i--) {
if (list[i].nodeType === 8 && list[i].data.indexOf("event_id:") !== -1) return list[i].data;
}
return "";
}
function two(n) {
return n < 10 ? "0" + n : "" + n;
}
function init() {
var raw = findInjected();
if (!raw) return;
var parts = raw.replace(/\s+/g, " ").trim().split(" ");
var get = function (key) {
var i = parts.indexOf(key + ":");
return i > -1 && parts[i + 1] ? parts[i + 1] : "";
};
var eventId = get("event_id");
var type = get("TYPE");
if (!eventId && !type) return;
var meta = document.getElementById("errorPage_PageMeta");
var elId = document.getElementById("errorPage_EventID");
var elType = document.getElementById("errorPage_TypeTime");
if (!meta || !elId || !elType) return;
var d = new Date();
var time = d.getFullYear() + "-" + two(d.getMonth() + 1) + "-" + two(d.getDate()) + " " + two(d.getHours()) + ":" + two(d.getMinutes());
elId.textContent = eventId ? "事件ID:" + eventId : "";
elType.textContent = (type ? "类型:" + type + " · " : "") + "拦截时间:" + time;
meta.style.display = "block";
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
window.addEventListener("load", init);
})();
</script>
</body>
</html>