nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx自定义错误页面

Nginx配置自定义404和502错误页面的完整流程

作者:知远漫谈

自定义错误页,尤其是对 404 和 502 这两个最常见错误的美化与引导,是每一个生产环境部署中不可或缺的环节,本文将深入探讨如何在 Nginx 中配置自定义 404 和 502 错误页面,涵盖从基础配置到高级优化的全过程,希望帮助开发者构建专业友好的错误处理系统

在现代 Web 应用架构中,Nginx 作为高性能的反向代理服务器和静态资源服务引擎,承担着流量分发、负载均衡、缓存加速、安全防护等关键职责。然而,无论系统多么健壮,总会遇到请求无法被正确处理的情况——客户端访问了一个不存在的页面(404 Not Found),或后端服务崩溃导致代理失败(502 Bad Gateway)。这些错误页若使用默认的 Nginx 简陋文本,不仅用户体验极差,还可能影响品牌形象,甚至让客户对系统稳定性产生质疑。

因此,自定义错误页,尤其是对 404 和 502 这两个最常见错误的美化与引导,是每一个生产环境部署中不可或缺的环节。本文将深入探讨如何在 Nginx 中配置自定义 404 和 502 错误页面,涵盖从基础配置到高级优化的全过程,结合 Java 后端服务的实际场景,提供可落地的代码示例、架构建议与性能考量,并通过可视化图表展示错误处理流程,帮助你构建一个既专业又人性化的用户错误体验体系。

为什么我们需要自定义错误页

想象一下,一位用户在你的电商网站上点击了一个“限时抢购”链接,结果页面弹出:

404 Not Found
nginx/1.20.1

或者在支付过程中后端服务临时宕机,用户看到:

502 Bad Gateway
nginx/1.20.1

这不仅让用户困惑:“是不是网站崩了?”、“我是不是点错了?”、“我的订单有没有成功?”,还可能直接导致用户流失。根据 Google 的研究,页面加载时间每增加1秒,转化率下降7%,而一个糟糕的错误页,其心理打击远超加载延迟。

自定义错误页的意义在于:

Nginx 错误页配置基础语法

Nginx 的错误页配置非常简洁,核心指令是 error_page,其语法如下:

error_page code ... [=[response]] uri;

示例:最基础的 404 自定义

假设我们有一个静态资源目录 /var/www/html/errors,里面存放了 404.html502.html 文件:

server {
    listen 80;
    server_name example.com;

    root /var/www/html;

    # 自定义 404 页面
    error_page 404 /errors/404.html;

    # 自定义 502 页面
    error_page 502 /errors/502.html;

    # 保证错误页能被访问
    location /errors/ {
        alias /var/www/html/errors;
        internal;  # 仅允许内部重定向访问,禁止直接通过 URL 访问
    }
}

关键点internal; 指令非常重要。它确保用户不能通过直接访问 http://example.com/errors/404.html 来查看错误页,防止暴露内部结构,同时保证 Nginx 在发生错误时能内部跳转访问。

为什么使用internal?

Nginx 的 internal 指令意味着该 location 块只能通过内部重定向(如 error_pagerewritetry_files)触发,不能通过浏览器直接访问。这是安全最佳实践。

location /errors/ {
    alias /var/www/html/errors;
    internal;  # ✅ 安全!外部无法直接访问
}

如果省略 internal,攻击者可能通过扫描 /errors/404.html 获取你的服务器结构、文件路径,甚至尝试注入恶意请求。

构建自定义 404 页面:不止是“页面未找到”

一个优秀的 404 页面,应该包含:

HTML 示例:优雅的 404 页面

我们将创建一个响应式、轻量、无 JS 依赖的纯 HTML/CSS 页面,适配移动端与桌面端。

<!-- /var/www/html/errors/404.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>404 - 页面找不到啦!</title>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background-color: #f8f9fa;
            color: #333;
            text-align: center;
            padding: 50px 20px;
            margin: 0;
        }
        .container {
            max-width: 600px;
            margin: 0 auto;
        }
        h1 {
            font-size: 3rem;
            color: #e74c3c;
            margin-bottom: 20px;
        }
        p {
            font-size: 1.2rem;
            line-height: 1.6;
            color: #666;
            margin-bottom: 30px;
        }
        .btn {
            display: inline-block;
            padding: 12px 24px;
            background-color: #3498db;
            color: white;
            text-decoration: none;
            border-radius: 6px;
            font-weight: bold;
            margin: 10px;
            transition: background-color 0.3s;
        }
        .btn:hover {
            background-color: #2980b9;
        }
        .search-box {
            width: 80%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 6px;
            margin: 20px 0;
            font-size: 1rem;
        }
        footer {
            margin-top: 50px;
            font-size: 0.9rem;
            color: #999;
        }
        @media (max-width: 600px) {
            h1 { font-size: 2rem; }
            p { font-size: 1rem; }
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>😔 404 - 页面找不到啦!</h1>
        <p>我们很抱歉,您访问的页面似乎被宇宙中的黑洞吞噬了。别担心,我们正在努力修复!</p>
        <input type="text" class="search-box" placeholder="试试搜索你要的内容..." id="searchInput">
        <button class="btn" onclick="search()">🔍 搜索</button>
        <a href="/" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="btn">🏠 返回首页</a>
        <footer>
            如果您认为这是个错误,请联系我们:<a href="mailto:support@example.com" rel="external nofollow"  rel="external nofollow" >support@example.com</a>
        </footer>
    </div>
    <script>
        function search() {
            const query = document.getElementById('searchInput').value.trim();
            if (query) {
                window.location.href = '/search?q=' + encodeURIComponent(query);
            }
        }
        // 按回车键触发搜索
        document.getElementById('searchInput').addEventListener('keypress', function(e) {
            if (e.key === 'Enter') {
                search();
            }
        });
    </script>
</body>
</html>

该页面不依赖任何外部 CDN,所有样式内联,加载速度极快,适合在低网络环境下使用。

Java 后端配合:动态生成 404 内容(可选)

虽然 Nginx 静态页面已足够,但在某些企业级系统中,我们希望根据用户身份、设备类型、访问来源动态生成 404 内容。比如:

此时,我们可以让 Nginx 将 404 请求转发给后端 Java 服务进行动态渲染。

Nginx 配置:

error_page 404 @dynamic_404;

location @dynamic_404 {
    internal;
    proxy_pass http://backend-app:8080/error/404;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Java Spring Boot 控制器示例:

package com.example.errorhandler.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.HashMap;
@RestController
@RequestMapping("/error")
public class ErrorHandlerController {
    @GetMapping("/404")
    public ResponseEntity<String> handle404(HttpServletRequest request) {
        String userAgent = request.getHeader("User-Agent");
        String ip = request.getRemoteAddr();
        String referer = request.getHeader("Referer");
        // 根据设备类型返回不同内容
        boolean isMobile = userAgent != null && 
                          (userAgent.contains("Mobile") || userAgent.contains("Android") || userAgent.contains("iPhone"));
        StringBuilder html = new StringBuilder();
        html.append("<!DOCTYPE html><html lang='zh-CN'><head><meta charset='UTF-8'><title>404 - 页面未找到</title>");
        html.append("<style>body { font-family: 'Arial', sans-serif; text-align: center; padding: 50px; background: #f5f5f5; }</style></head><body>");
        if (isMobile) {
            html.append("<h1>📱 您访问的页面在移动端已失效</h1>");
            html.append("<p>建议下载我们的 App 获取完整功能:<a href='https://example.com/app'>下载 App</a></p>");
        } else {
            html.append("<h1>😔 页面不见了?</h1>");
            html.append("<p>您访问的链接可能已失效或被删除。</p>");
        }
        html.append("<p>您可以 <a href='/'>返回首页</a> 或 <a href='/search'>搜索内容</a>。</p>");
        html.append("<p>如需帮助,请联系客服:<a href='mailto:support@example.com'>support@example.com</a></p>");
        html.append("</body></html>");
        return ResponseEntity.status(HttpStatus.NOT_FOUND)
                .header("Content-Type", "text/html; charset=UTF-8")
                .body(html.toString());
    }
}

优势:你可以记录访问日志、分析用户来源、推送个性化推荐,甚至根据 IP 地理位置显示本地化内容(如“您在北京,附近门店:XXX”)。

配置建议:静态 vs 动态 404

方案优点缺点适用场景
静态 HTML极快、稳定、零依赖、节省资源无法个性化90% 的中小型网站
动态 Java 渲染可个性化、可埋点、可多语言增加后端负载、依赖服务可用性大型平台、会员系统、国际化网站

推荐策略:大多数场景优先使用静态页面。只有在需要用户身份识别、个性化引导、埋点分析时,才启用动态生成。

502 Bad Gateway:当后端“失联”时如何优雅应对

502 错误意味着 Nginx 成功接收到客户端请求,但无法从后端服务(如 Java Tomcat、Spring Boot)获得有效响应。常见原因包括:

在微服务架构中,502 是高频错误。一个优秀的 502 页面不应只是“服务暂时不可用”,而应提供安慰 + 指引 + 信心重建

自定义 502 页面 HTML 示例

<!-- /var/www/html/errors/502.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>502 - 服务暂时不可用</title>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background-color: #f0f7ff;
            color: #2c3e50;
            text-align: center;
            padding: 60px 20px;
            margin: 0;
        }
        .container {
            max-width: 600px;
            margin: 0 auto;
        }
        h1 {
            font-size: 3rem;
            color: #e67e22;
            margin-bottom: 20px;
        }
        .icon {
            font-size: 5rem;
            margin-bottom: 30px;
            color: #bdc3c7;
        }
        p {
            font-size: 1.3rem;
            line-height: 1.7;
            margin-bottom: 40px;
            color: #555;
        }
        .btn {
            display: inline-block;
            padding: 14px 30px;
            background-color: #3498db;
            color: white;
            text-decoration: none;
            border-radius: 8px;
            font-weight: bold;
            margin: 10px;
            font-size: 1.1rem;
            transition: all 0.3s;
            border: none;
            cursor: pointer;
        }
        .btn:hover {
            background-color: #2980b9;
            transform: translateY(-2px);
            box-shadow: 0 4px 12px rgba(52, 152, 219, 0.3);
        }
        .retry-btn {
            background-color: #2ecc71;
        }
        .retry-btn:hover {
            background-color: #27ae60;
        }
        footer {
            margin-top: 60px;
            font-size: 0.9rem;
            color: #7f8c8d;
        }
        .status {
            background-color: #ecf0f1;
            padding: 12px;
            border-radius: 6px;
            display: inline-block;
            margin: 20px 0;
            font-size: 0.9rem;
            color: #95a5a6;
        }
        @media (max-width: 600px) {
            h1 { font-size: 2.2rem; }
            .icon { font-size: 4rem; }
            p { font-size: 1.1rem; }
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="icon">⚡</div>
        <h1>502 - 服务暂时不可用</h1>
        <p>我们正在努力恢复服务,您的请求暂时无法处理。这通常是由于系统正在维护或临时过载。</p>
        <div class="status">系统状态:正在修复中</div>
        <a href="/" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="btn">🏠 返回首页</a>
        <a href="javascript:location.reload()" rel="external nofollow"  class="btn retry-btn">🔄 重试</a>
        <p>如需帮助,请访问我们的 <a href="https://status.example.com" rel="external nofollow" >服务状态页</a>,或联系客服:</p>
        <a href="mailto:support@example.com" rel="external nofollow"  rel="external nofollow" >support@example.com</a>
        <footer>
            感谢您的耐心与理解 —— 我们正在全力以赴恢复服务。
        </footer>
    </div>
    <script>
        // 自动重试机制:3秒后尝试刷新
        setTimeout(() => {
            location.reload();
        }, 3000);
    </script>
</body>
</html>

设计亮点

服务状态页(Service Status Page):企业级标配

建议为你的系统搭建一个独立的“服务状态页”,展示所有核心服务的实时健康状态。可以使用开源工具如:

即使你使用的是自建状态页,也建议在 502 页面中提供链接,让用户知道“这不是你一个人的问题”,而是系统级故障,且团队正在处理。

Nginx 错误页配置进阶:多状态码统一处理

在生产环境中,我们通常希望对多个错误码使用相同的页面布局,比如 500、502、503、504 都使用“服务异常”模板,仅标题不同。

Nginx 支持多状态码绑定同一页面

error_page 500 502 503 504 /errors/5xx.html;

这样,无论后端是超时、崩溃、还是过载,用户看到的都是同一个“服务异常”页面,统一了体验。

5xx 统一页面设计建议

<!-- /var/www/html/errors/5xx.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>服务异常</title>
    <style>
        body { font-family: sans-serif; text-align: center; padding: 80px; background: #f8f9fa; }
        h1 { color: #e74c3c; font-size: 3rem; }
        .code { font-size: 8rem; font-weight: bold; color: #bdc3c7; margin: 20px 0; }
        p { font-size: 1.5rem; color: #555; }
        .btn { padding: 15px 40px; background: #3498db; color: white; text-decoration: none; border-radius: 10px; font-size: 1.2rem; }
    </style>
</head>
<body>
    <div class="code">❌</div>
    <h1>服务暂时不可用</h1>
    <p>我们正在处理技术问题,感谢您的耐心等待。</p>
    <a href="/" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="btn">返回首页</a>
    <p><small>错误代码:<span id="errorCode">500</span></small></p>
    <script>
        // 从 URL 中提取状态码(如 /errors/5xx.html?code=502)
        const urlParams = new URLSearchParams(window.location.search);
        const code = urlParams.get('code') || '500';
        document.getElementById('errorCode').textContent = code;
    </script>
</body>
</html>

Nginx 配置:传递错误码

为了让前端页面知道当前是 502 还是 503,我们可以使用变量 $status

error_page 500 502 503 504 /errors/5xx.html?code=$status;

$status 是 Nginx 内置变量,代表当前请求的 HTTP 状态码。通过 ?code=$status 传参,前端 JS 可动态显示“当前错误:502”。

避免错误页的“无限重定向”陷阱

一个常见的错误配置是:

error_page 404 /404.html;
location = /404.html {
    root /var/www/html/errors;
}

如果 /var/www/html/errors/404.html 本身也不存在,Nginx 会再次触发 404 → 重定向到 /404.html → 再次不存在 → 无限循环 → 最终返回 500。

正确做法:使用alias+internal

error_page 404 /errors/404.html;

location /errors/ {
    alias /var/www/html/errors;
    internal;
}

确保:

测试命令

curl -I http://example.com/this-page-does-not-exist

应看到:

HTTP/1.1 404 Not Found
Content-Type: text/html
Content-Length: 1234

并能通过 curl http://example.com/this-page-does-not-exist 查看 HTML 内容。

Java 后端配合:记录错误页访问日志

自定义错误页不仅是前端展示,更是可观测性的重要入口。我们可以通过 Java 后端记录所有 404/502 的访问,用于:

Spring Boot 日志记录器示例

package com.example.errorhandler.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class ErrorPageLoggingFilter extends OncePerRequestFilter {
    private static final Logger logger = LoggerFactory.getLogger(ErrorPageLoggingFilter.class);
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        filterChain.doFilter(request, response);
        // 只记录 404 和 502
        int status = response.getStatus();
        if (status == 404 || status == 502) {
            String uri = request.getRequestURI();
            String method = request.getMethod();
            String userAgent = request.getHeader("User-Agent");
            String referer = request.getHeader("Referer");
            String remoteAddr = request.getRemoteAddr();
            logger.warn("ERROR_PAGE_ACCESS | status={}|method={}|uri={}|ip={}|userAgent={}|referer={}",
                    status, method, uri, remoteAddr, userAgent, referer);
        }
    }
}

该过滤器不会影响正常请求,仅在发生 404/502 时记录,对性能影响极小。

日志输出示例:

2024-06-15 10:23:45 WARN  ErrorPageLoggingFilter - ERROR_PAGE_ACCESS | status=404|method=GET|uri=/api/v1/user/12345|ip=192.168.1.100|userAgent=Mozilla/5.0 (iPhone)|referer=https://google.com/search?q=our-site+products

这些日志可被 ELK、Loki、Datadog 等工具收集,生成“死链热力图”、“爬虫攻击趋势图”,辅助产品优化。

性能优化:错误页缓存与 CDN 集成

虽然错误页是静态资源,但若部署在 CDN 上,仍需注意:

Nginx 缓存配置(仅限静态错误页)

location /errors/ {
    alias /var/www/html/errors;
    internal;

    # 缓存 1 小时
    expires 1h;
    add_header Cache-Control "public, immutable";
    
    # 静态文件压缩
    gzip on;
    gzip_types text/html;
}

CDN 配置建议(以 Cloudflare 为例)

Mermaid 图表:Nginx 错误处理流程图

该图表清晰展示了 Nginx 处理 404 和 502 的两条路径,强调了 error_page 配置的关键作用。在实际运维中,建议将此图打印张贴在团队看板上,作为新成员培训材料。

安全加固:防止错误页被滥用

错误页虽然“无害”,但若配置不当,可能成为攻击入口:

1. 避免暴露服务器信息

server_tokens off;  # 关闭 nginx/1.20.1 版本信息

2. 禁止访问错误页目录

location ~ ^/errors/ {
    deny all;
}

3. 防止 SSRF 攻击

若你的 error_page 跳转到外部 URL(如 http://external.com/404),攻击者可能伪造 Host 头进行 SSRF:

error_page 404 http://attacker.com/evil;  # ⚠️ 危险!

永远不要在 error_page 中使用外部 URL,除非你明确知道风险并做了严格校验。

安全建议:所有错误页必须使用内部路径,避免任何外部跳转。

高可用架构:多节点部署时的错误页同步

在多 Nginx 节点集群中,如何保证所有节点的错误页一致?

方案一:共享文件系统(NFS)

# 所有 Nginx 节点挂载同一 NFS 目录
mount -t nfs 192.168.1.10:/data/errors /var/www/html/errors

方案二:使用容器编排(Docker + Volume)

# docker-compose.yml
version: '3.8'
services:
  nginx:
    image: nginx:alpine
    volumes:
      - ./errors:/var/www/html/errors  # 共享错误页目录
    ports:
      - "80:80"

方案三:CI/CD 自动部署

使用 Ansible、Rsync、Git Hook 等工具,自动将错误页文件同步到所有 Nginx 实例:

#!/bin/bash
# deploy-errors.sh
rsync -avz ./errors/ user@nginx1:/var/www/html/errors/
rsync -avz ./errors/ user@nginx2:/var/www/html/errors/
rsync -avz ./errors/ user@nginx3:/var/www/html/errors/
systemctl reload nginx

建议将错误页文件纳入版本控制系统(如 Git),并作为部署流水线的一部分,实现“配置即代码”。

监控与告警:错误页访问量突增 = 系统异常信号

错误页访问量突然飙升,往往是系统问题的早期信号:

Prometheus + Grafana 监控示例(基于 Nginx 日志)

在 Nginx 配置中启用日志格式:

log_format error_log '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/error-access.log error_log;

使用 Filebeat 收集日志,通过 Logstash 解析,写入 Elasticsearch,Grafana 绘制:

设置告警规则:当 502 错误 > 100 次/分钟 时,触发企业微信/钉钉告警

Java 应用埋点示例(Prometheus)

import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ErrorCounter {
    @Autowired
    private MeterRegistry registry;
    public void increment404() {
        registry.counter("http.errors.404.total").increment();
    }
    public void increment502() {
        registry.counter("http.errors.502.total").increment();
    }
}

ErrorPageLoggingFilter 中调用:

if (status == 404) {
    errorCounter.increment404();
} else if (status == 502) {
    errorCounter.increment502();
}

可视化:Grafana 面板显示 404/502 实时曲线,帮助运维快速定位问题。

常见误区与避坑指南

误区正确做法
❌ 使用 root 而非 alias 指定错误页路径✅ 使用 alias 指向绝对路径
❌ 忘记加 internal✅ 所有错误页 location 必须加 internal
❌ 错误页文件路径写错✅ 使用 nginx -t 测试配置,curl 测试访问
❌ 使用外部 URL 作为 error_page✅ 仅允许内部路径,避免 SSRF
❌ 错误页过大(含 JS/CSS/图片)✅ 保持轻量,内联 CSS,无外部依赖
❌ 不记录错误页访问日志✅ 记录并分析,用于优化与告警
❌ 502 页面不提供“重试”或“返回首页”✅ 提供明确操作路径,降低用户焦虑

总结:打造极致用户体验的错误页体系

自定义错误页不是“锦上添花”,而是系统稳定性的最后一道防线。一个精心设计的 404 和 502 页面,能:

附录:完整 Nginx 配置模板

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # 关闭版本信息
    server_tokens off;

    # 静态资源缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # 错误页配置
    error_page 404 /errors/404.html;
    error_page 500 502 503 504 /errors/5xx.html?code=$status;

    location /errors/ {
        alias /var/www/html/errors;
        internal;
        expires 1h;
        add_header Cache-Control "public, immutable";
        gzip on;
        gzip_types text/html;
    }

    # 代理 Java 后端
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 30s;
        proxy_connect_timeout 10s;
    }
}

将此模板保存为 nginx-error-pages.conf,作为你的标准配置模板,部署到所有环境。

结语:错误,是系统最诚实的反馈

每一个 404,都是用户在试图探索你的系统边界;

每一个 502,都是后端在向你发出求救信号。

你如何回应这些“失败”,决定了用户是否愿意再次回来。

真正的系统高可用,不是 99.99% 的 uptime,而是当它宕机时,依然能温柔地告诉用户:“我们在这里,正在努力。”

愿你的每一个错误页,都成为用户心中的一缕暖光。

以上就是Nginx配置自定义404和502错误页面的完整流程的详细内容,更多关于Nginx自定义错误页面的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文