html 通用错误页面

因为业务业务需求,需要做一个错误的页面,避免出现错误信息或者相关业务信息泄露,所以在Nginx配置一个通用错误页面。

完成后页面访问路径:

/error.htmlstatus=500&uri=/user&time_local=2024年7月29日10:16:04&remote_addr=127.0.0.1&args=test=1


Nginx获取相关错误信息的方式:

复制代码
location / {
	#root  D:/Product/xxx;
	proxy_pass http://192.168.110.28:8080;
	#主要是拦截tomcat的错误,不然获取不到Java抛出的异常
	proxy_intercept_errors on; # 开启错误拦截
}
error_page  404 405 500 502 503 504  /50x.html;
location /50x.html {
	internal;  # 确保该页面只能通过内部重定向访问
    root   html;
	# 传递状态码和其他信息到自定义页面
	rewrite ^ /error.html?status=$status&uri=$uri&remote_addr=$remote_addr&http_user_agent=$http_user_agent&time_local=$time_local permanent;
}
# 目标前缀
location /error.html {

}

以下是一些常用的 Nginx 变量及其用途,你可以在错误页面或日志中使用这些变量:

  1. 请求相关信息:
    request: 完整的原始请求行。 uri: 当前请求的 URI(不包含请求参数)。
    args: 请求参数。 request_body: 请求体内容。
    request_method: 请求方法(例如 GET、POST 等)。 remote_addr: 客户端 IP 地址。
    remote_port: 客户端端口。 http_user_agent: 客户端的 User-Agent 头信息。
    $http_referer: 引用页面(Referer 头信息)。
  2. 服务器相关信息:
    server_name: 服务器名称。 server_addr: 服务器地址。
    server_port: 服务器端口。 hostname: 服务器主机名。
  3. 连接和会话信息:
    connection: 连接序列号。 connection_requests: 当前连接上的请求数量。
    cookie_name: 指定的 cookie 值(例如 cookie_SESSIONID 获取名为 SESSIONID 的 cookie 值)。
  4. 时间相关信息:
    time_iso8601: 当前时间,ISO 8601 格式。 time_local: 当前时间,本地时间格式。

完整代码:

复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8"/>
    <title>错误页面</title>
    <style>
        body {
            margin: 0;
        }

        h1 {
            font-family: 'Lato', sans-serif;
            font-weight: 300;
            letter-spacing: 2px;
            font-size: 48px;
        }

        p {
            font-family: 'Lato', sans-serif;
            letter-spacing: 1px;
            font-size: 14px;
            color: #333333;
        }

        .header {
            position: relative;
            text-align: center;
            background: linear-gradient(60deg, rgba(84, 58, 183, 1) 0%, rgba(0, 172, 193, 1) 100%);
            color: white;
        }

        .logo {
            width: 50px;
            fill: white;
            padding-right: 15px;
            display: inline-block;
            vertical-align: middle;
        }

        .inner-header {
            height: 65vh;
            width: 100%;
            margin: 0;
            padding: 0;
        }

        .flex {
            /*Flexbox for containers*/
            display: flex;
            justify-content: center;
            align-items: center;
            text-align: center;
        }

        .waves {
            position: relative;
            width: 100%;
            height: 15vh;
            margin-bottom: -7px; /*Fix for safari gap*/
            min-height: 100px;
            max-height: 150px;
        }

        .content .button {
            display: inline-block;
            padding: 0 20px;
            line-height: 40px;
            font-size: 14px;
            color: #fff;
            background-color: #5dadf5;
            text-decoration: none;
        }

        .content .button:hover {
            opacity: .9;
        }

        /* Animation */

        .parallax > use {
            animation: move-forever 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite;
        }

        .parallax > use:nth-child(1) {
            animation-delay: -2s;
            animation-duration: 7s;
        }

        .parallax > use:nth-child(2) {
            animation-delay: -3s;
            animation-duration: 10s;
        }

        .parallax > use:nth-child(3) {
            animation-delay: -4s;
            animation-duration: 13s;
        }

        .parallax > use:nth-child(4) {
            animation-delay: -5s;
            animation-duration: 20s;
        }

        @keyframes move-forever {
            0% {
                transform: translate3d(-90px, 0, 0);
            }
            100% {
                transform: translate3d(85px, 0, 0);
            }
        }

        /*Shrinking for mobile*/
        @media (max-width: 768px) {
            .waves {
                height: 40px;
                min-height: 40px;
            }

            .content {
                height: 30vh;
            }

            h1 {
                font-size: 24px;
            }
        }

        .card {
            text-align: left;
            letter-spacing: 1px;
            color: #666666;
            width: 300px;
            padding: 20px 100px;
            min-height: 250px;
            background: rgba(255, 255, 255, .4);
            border-radius: 5px;
        }

        .card .card-title {
            color: #ff2929;
            padding: 10px 0;
            font-size: 24px;
        }

        .card .card-content{
            word-break: break-all;
        }

    </style>
</head>
<body>
<div class="header">
    <div class="inner-header flex">
        <div class="card">
            <div class="card-title"><b class="status"></b> 页面响应错误!</div>
            <div class="card-content">
                <p>页面状态:<span class="status"></span></p>
                <p>访问地址:<span class="uri"></span></p>
                <p>请求参数:<span class="args"></span></p>
                <p>访问时间:<span class="time_local"></span></p>
                <p>客户端 IP:<span class="remote_addr"></span></p>
            </div>
        </div>
    </div>
    <svg
            class="waves"
            xmlns="http://www.w3.org/2000/svg"
            xmlns:xlink="http://www.w3.org/1999/xlink"
            viewBox="0 24 150 28"
            preserveAspectRatio="none"
            shape-rendering="auto"
    >
        <defs>
            <path
                    id="gentle-wave"
                    d="M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z"
            />
        </defs>
        <g class="parallax">
            <use xlink:href="#gentle-wave" x="48" y="0" fill="rgba(255,255,255,0.7"/>
            <use xlink:href="#gentle-wave" x="48" y="3" fill="rgba(255,255,255,0.5)"/>
            <use xlink:href="#gentle-wave" x="48" y="5" fill="rgba(255,255,255,0.3)"/>
            <use xlink:href="#gentle-wave" x="48" y="7" fill="#fff"/>
        </g>
    </svg>
</div>

<div class="content flex">
    <p>
        <a class="button" href="/">返回主页</a>
    </p>
</div>

</body>
<script type="text/javascript">
    var urlParams = new URLSearchParams(window.location.search);
    var statusCode = urlParams.get('status');
    document.querySelectorAll('.status').forEach(function (e) {
        e.textContent = statusCode;
    })
    document.querySelector('.uri').textContent = urlParams.get('uri');
    document.querySelector('.args').textContent = urlParams.get('args');
    document.querySelector('.time_local').textContent = urlParams.get('time_local');
    document.querySelector('.remote_addr').textContent = urlParams.get('remote_addr');
</script>
</html>
相关推荐
醉城夜风~25 分钟前
CSS元素显示模式(display)
前端·css
AI大模型-小华1 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子3 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅4 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni4 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学5 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端
赵庆明老师6 小时前
Vben精讲:21-详解web-antd:tsconfig.json
前端·json·vim
wc886 小时前
微软EDGE浏览器功能学习
前端·学习·edge
Csvn6 小时前
🎯 原生 `<dialog>` 元素:终于可以扔掉一半的自定义弹窗组件了?
前端