最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx自定義錯(cuò)誤頁面樣式與內(nèi)容的配置方法

 更新時(shí)間:2026年07月14日 08:34:56   作者:知遠(yuǎn)漫談  
當(dāng)后端服務(wù)異常、資源未找到、請(qǐng)求超時(shí)或權(quán)限被拒絕時(shí),Nginx 會(huì)返回默認(rèn)的錯(cuò)誤頁面,本文將帶你從零開始,深入掌握 Nginx 錯(cuò)誤頁面的自定義全流程,需要的朋友可以參考下

引言

在現(xiàn)代 Web 應(yīng)用的架構(gòu)中,Nginx 作為高性能的反向代理服務(wù)器和靜態(tài)資源服務(wù)器,承擔(dān)著至關(guān)重要的角色。它不僅負(fù)責(zé)請(qǐng)求的負(fù)載均衡、緩存加速、SSL 終止,更在用戶與系統(tǒng)交互的“第一道門”上扮演著守護(hù)者與引導(dǎo)者的角色。當(dāng)后端服務(wù)異常、資源未找到、請(qǐng)求超時(shí)或權(quán)限被拒絕時(shí),Nginx 會(huì)返回默認(rèn)的錯(cuò)誤頁面——這些頁面通常由純文本或極簡(jiǎn) HTML 構(gòu)成,缺乏品牌一致性,甚至可能讓用戶感到困惑、不安,甚至直接流失。

?? 默認(rèn)的 404 頁面:“404 Not Found”
? 自定義的 404 頁面:“哎呀,您尋找的頁面似乎迷路了 ?? 我們正在努力找回它!”

這不僅是美觀問題,更是用戶體驗(yàn)(UX)設(shè)計(jì)品牌信任建設(shè)的核心環(huán)節(jié)。一個(gè)精心設(shè)計(jì)的錯(cuò)誤頁面,能夠?qū)⒂脩舻呢?fù)面情緒轉(zhuǎn)化為耐心與好感,甚至引導(dǎo)他們繼續(xù)探索你的產(chǎn)品。本文將帶你從零開始,深入掌握 Nginx 錯(cuò)誤頁面的自定義全流程——包括配置原理、靜態(tài)資源部署、動(dòng)態(tài)內(nèi)容生成、Java 后端聯(lián)動(dòng)、多語言支持、響應(yīng)式樣式設(shè)計(jì)、性能優(yōu)化與監(jiān)控策略,最終構(gòu)建出一個(gè)既專業(yè)又富有溫度的錯(cuò)誤響應(yīng)體系。

為什么我們需要自定義錯(cuò)誤頁面?

在討論“如何做”之前,我們先明確“為什么必須做”。

1. 用戶體驗(yàn)的“第一印象”是關(guān)鍵

根據(jù) Google 的研究,用戶在 0.5 秒內(nèi)就會(huì)對(duì)網(wǎng)站的專業(yè)性形成初步判斷。當(dāng)用戶點(diǎn)擊一個(gè)鏈接,卻看到一個(gè)冰冷的“404 Not Found”頁面,他們的第一反應(yīng)是:

  • “這個(gè)網(wǎng)站是不是已經(jīng)廢棄了?”
  • “是不是我點(diǎn)錯(cuò)了?”
  • “這家公司的技術(shù)是不是很落后?”

而一個(gè)設(shè)計(jì)精良、帶有品牌元素、提供導(dǎo)航建議、甚至幽默文案的錯(cuò)誤頁面,則能:

  • 減少跳出率 ??
  • 增強(qiáng)品牌親和力 ??
  • 引導(dǎo)用戶回到核心路徑 ??

2. 品牌一致性不容忽視

企業(yè)網(wǎng)站、SaaS 平臺(tái)、API 服務(wù),都應(yīng)保持統(tǒng)一的視覺語言。默認(rèn)的 Nginx 錯(cuò)誤頁使用的是系統(tǒng)字體、灰白配色、無 Logo、無鏈接,完全脫離了你的品牌體系。自定義錯(cuò)誤頁是品牌露出的“隱形窗口”。

3. 安全與信息控制

默認(rèn)錯(cuò)誤頁面可能暴露服務(wù)器版本、操作系統(tǒng)、模塊信息(如 Server: nginx/1.20.1),這為攻擊者提供了可利用的指紋信息。通過自定義,我們可以:

  • 隱藏服務(wù)器指紋
  • 不暴露后端技術(shù)棧
  • 避免泄露內(nèi)部路徑結(jié)構(gòu)

4. 多語言與國(guó)際化支持

如果你的用戶遍布全球,僅提供英文錯(cuò)誤頁是遠(yuǎn)遠(yuǎn)不夠的。通過 Nginx 與后端 Java 服務(wù)的聯(lián)動(dòng),我們可以實(shí)現(xiàn)基于 Accept-Language 請(qǐng)求頭的動(dòng)態(tài)錯(cuò)誤頁面,為中文、日文、德文用戶提供本地化體驗(yàn)。

5. 監(jiān)控與分析的入口

自定義錯(cuò)誤頁可以嵌入輕量級(jí)的埋點(diǎn)代碼,記錄用戶訪問錯(cuò)誤頁的時(shí)間、來源 URL、設(shè)備類型、地理位置等信息,為運(yùn)維團(tuán)隊(duì)提供寶貴的用戶行為分析數(shù)據(jù),幫助發(fā)現(xiàn)死鏈、爬蟲攻擊、API 調(diào)用異常等問題。

Nginx 錯(cuò)誤頁面的底層機(jī)制

Nginx 通過 error_page 指令實(shí)現(xiàn)錯(cuò)誤頁面的重定向與自定義。這個(gè)指令的本質(zhì)是:當(dāng)發(fā)生指定 HTTP 狀態(tài)碼時(shí),Nginx 將請(qǐng)求內(nèi)部重定向到另一個(gè) URI,由該 URI 返回的內(nèi)容作為最終響應(yīng)。

基礎(chǔ)語法

error_page code [...] [=[response]] uri;
  • code:HTTP 狀態(tài)碼,如 404500、502
  • uri:目標(biāo)路徑,可以是本地文件、內(nèi)部重定向、或外部 URL
  • [=response]:可選,用于修改返回的狀態(tài)碼(如將 404 改為 200)

示例配置

server {
    listen 80;
    server_name example.com;
    # 自定義 404 頁面
    error_page 404 /error/404.html;
    # 自定義 500 頁面,同時(shí)修改返回狀態(tài)碼為 200(用于前端 SPA 處理)
    error_page 500 502 503 504 =200 /error/5xx.html;
    # 靜態(tài)資源根目錄
    root /var/www/html;
    location /error/ {
        alias /var/www/errors;
        internal;  # 僅允許內(nèi)部重定向訪問,禁止直接訪問
    }
    location / {
        try_files $uri $uri/ =404;
    }
}

關(guān)鍵點(diǎn)解析

指令作用
error_page 404 /error/404.html;當(dāng)發(fā)生 404 時(shí),Nginx 內(nèi)部跳轉(zhuǎn)到 /error/404.html
alias /var/www/errors;/error/ 路徑映射到服務(wù)器上的 /var/www/errors 目錄
internal;非常重要! 確保用戶無法直接通過瀏覽器訪問 /error/404.html,防止繞過邏輯
=200將 5xx 錯(cuò)誤的響應(yīng)狀態(tài)碼改為 200,適用于前端單頁應(yīng)用(SPA)框架統(tǒng)一處理錯(cuò)誤

?? 注意:internal 指令是安全最佳實(shí)踐。若不設(shè)置,攻擊者可能通過訪問 /error/500.html 獲取你的錯(cuò)誤頁面模板,進(jìn)而推測(cè)系統(tǒng)架構(gòu)。

構(gòu)建靜態(tài)錯(cuò)誤頁面:HTML + CSS + JS

我們先從最基礎(chǔ)的靜態(tài)方式開始。假設(shè)我們希望為 404500、502 分別設(shè)計(jì)獨(dú)立頁面。

文件結(jié)構(gòu)規(guī)劃

/var/www/errors/
├── 404.html
├── 500.html
├── 502.html
├── css/
│   └── error.css
├── js/
│   └── error.js
└── assets/
    ├── logo.svg
    └── illustration.png

提示:雖然我們不使用圖片鏈接,但你可以使用 SVG 內(nèi)聯(lián)方式嵌入矢量圖形,既輕量又無外部依賴。

404 頁面示例:/var/www/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>頁面找不到了 ??</title>
    <link rel="stylesheet" href="/error/css/error.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
    <style>
        /* 內(nèi)聯(lián)關(guān)鍵樣式,確保即使 CSS 加載失敗也能基本可讀 */
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background-color: #f8f9fa;
            color: #333;
            text-align: center;
            padding: 4rem 1rem;
            margin: 0;
        }
        .error-container {
            max-width: 600px;
            margin: 0 auto;
        }
        .emoji {
            font-size: 8rem;
            margin: 1rem 0;
        }
        h1 {
            font-weight: 600;
            font-size: 2.5rem;
            color: #555;
        }
        p {
            font-size: 1.2rem;
            line-height: 1.6;
            color: #666;
            margin: 1.5rem 0;
        }
        .btn {
            display: inline-block;
            background: #007bff;
            color: white;
            padding: 0.8rem 1.5rem;
            text-decoration: none;
            border-radius: 50px;
            font-weight: 600;
            margin: 0.8rem;
            transition: background 0.3s;
        }
        .btn:hover {
            background: #0056b3;
        }
        .footer {
            margin-top: 3rem;
            font-size: 0.9rem;
            color: #999;
        }
    </style>
</head>
<body>
    <div class="error-container">
        <div class="emoji">??</div>
        <h1>頁面不見了</h1>
        <p>抱歉,您訪問的頁面可能已被移除、改名,或暫時(shí)無法訪問。</p>
        <p>您可以嘗試:</p>
        <ul style="text-align: left; display: inline-block; margin: 1.5rem auto; font-size: 1.1rem;">
            <li>?? 返回 <a href="/" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  style="color: #007bff; text-decoration: none;">首頁</a></li>
            <li>?? 檢查網(wǎng)址拼寫</li>
            <li>?? 使用頂部搜索框查找內(nèi)容</li>
        </ul>
        <a href="/" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="btn">回到首頁</a>
        <a href="/contact" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="btn" style="background: #6c757d;">聯(lián)系我們</a>
        <div class="footer">
            ? 2025 YourCompany Inc. · 服務(wù)熱線:400-123-4567
        </div>
    </div>
    <script src="/error/js/error.js"></script>
    <script>
        // 記錄 404 訪問事件(發(fā)送到后端分析服務(wù))
        document.addEventListener('DOMContentLoaded', function() {
            fetch('/api/analytics/error', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    type: '404',
                    url: window.location.href,
                    referrer: document.referrer,
                    userAgent: navigator.userAgent,
                    timestamp: new Date().toISOString()
                })
            }).catch(console.error);
        });
    </script>
</body>
</html>

500 頁面示例:/var/www/errors/500.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>服務(wù)器有點(diǎn)累了 ???</title>
    <link rel="stylesheet" href="/error/css/error.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background-color: #f8f9fa;
            color: #333;
            text-align: center;
            padding: 4rem 1rem;
            margin: 0;
        }
        .error-container {
            max-width: 600px;
            margin: 0 auto;
        }
        .emoji {
            font-size: 8rem;
            margin: 1rem 0;
            color: #dc3545;
        }
        h1 {
            font-weight: 600;
            font-size: 2.5rem;
            color: #555;
        }
        p {
            font-size: 1.2rem;
            line-height: 1.6;
            color: #666;
            margin: 1.5rem 0;
        }
        .btn {
            display: inline-block;
            background: #28a745;
            color: white;
            padding: 0.8rem 1.5rem;
            text-decoration: none;
            border-radius: 50px;
            font-weight: 600;
            margin: 0.8rem;
            transition: background 0.3s;
        }
        .btn:hover {
            background: #218838;
        }
        .footer {
            margin-top: 3rem;
            font-size: 0.9rem;
            color: #999;
        }
        .retry {
            animation: pulse 2s infinite;
        }
        @keyframes pulse {
            0% { transform: scale(1); }
            50% { transform: scale(1.05); }
            100% { transform: scale(1); }
        }
    </style>
</head>
<body>
    <div class="error-container">
        <div class="emoji">??</div>
        <h1>服務(wù)器出了一點(diǎn)小狀況</h1>
        <p>我們正在努力修復(fù)這個(gè)問題。請(qǐng)稍后再試,或聯(lián)系我們的支持團(tuán)隊(duì)。</p>
        <p><small>錯(cuò)誤代碼:500 Internal Server Error</small></p>
        <a href="/" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="btn">返回首頁</a>
        <a href="/contact" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="btn" style="background: #6c757d;">獲取幫助</a>
        <div class="footer">
            ? 2025 YourCompany Inc. · 我們承諾 99.9% 的服務(wù)可用性
            <span class="retry">?? 自動(dòng)重試中…</span>
        </div>
    </div>
    <script src="/error/js/error.js"></script>
    <script>
        // 500 頁面自動(dòng)重試機(jī)制(5秒后嘗試刷新)
        setTimeout(() => {
            if (confirm('系統(tǒng)正在嘗試恢復(fù),是否立即刷新頁面?')) {
                window.location.reload();
            }
        }, 5000);
        // 上報(bào)錯(cuò)誤事件
        document.addEventListener('DOMContentLoaded', function() {
            fetch('/api/analytics/error', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    type: '500',
                    url: window.location.href,
                    referrer: document.referrer,
                    userAgent: navigator.userAgent,
                    timestamp: new Date().toISOString()
                })
            }).catch(console.error);
        });
    </script>
</body>
</html>

CSS 與 JS 公共資源

/var/www/errors/css/error.css

/* 公共錯(cuò)誤頁樣式 */
body {
    margin: 0;
    padding: 0;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
    background-color: #f8f9fa;
    color: #333;
}
.error-container {
    max-width: 700px;
    margin: 0 auto;
    padding: 2rem;
    background: white;
    border-radius: 12px;
    box-shadow: 0 10px 30px rgba(0,0,0,0.08);
}
.emoji {
    font-size: 6rem;
    margin: 1.5rem 0;
}
h1 {
    font-weight: 700;
    font-size: 2.2rem;
    margin: 1rem 0;
}
p {
    font-size: 1.1rem;
    line-height: 1.7;
    color: #555;
    margin: 1.5rem 0;
}
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: #007bff;
    color: white;
    padding: 0.75rem 1.5rem;
    text-decoration: none;
    border-radius: 30px;
    font-weight: 600;
    font-size: 1rem;
    margin: 0.5rem;
    border: none;
    cursor: pointer;
    transition: all 0.3s ease;
    box-shadow: 0 4px 10px rgba(0,123,255,0.25);
}
.btn:hover {
    transform: translateY(-2px);
    box-shadow: 0 6px 15px rgba(0,123,255,0.35);
}
.btn:active {
    transform: translateY(0);
}
.footer {
    margin-top: 3rem;
    font-size: 0.9rem;
    color: #888;
    line-height: 1.5;
}
@media (max-width: 768px) {
    .error-container {
        padding: 1.5rem;
    }
    .emoji {
        font-size: 5rem;
    }
    h1 {
        font-size: 1.8rem;
    }
    p {
        font-size: 1rem;
    }
}

/var/www/errors/js/error.js

// 公共錯(cuò)誤頁腳本:統(tǒng)一埋點(diǎn)、語言檢測(cè)、交互增強(qiáng)
(function() {
    // 檢測(cè)用戶語言偏好
    const lang = navigator.language || navigator.userLanguage;
    const supportedLangs = ['zh-CN', 'zh-TW', 'en-US', 'ja-JP', 'ko-KR'];
    const userLang = supportedLangs.find(l => lang.startsWith(l)) || 'en-US';
    // 可選:根據(jù)語言動(dòng)態(tài)替換頁面文本(需配合后端 i18n)
    if (userLang !== 'zh-CN') {
        document.documentElement.lang = userLang;
        // 可在此處通過 fetch 加載語言包,或由后端動(dòng)態(tài)注入
    }
    // 埋點(diǎn):記錄錯(cuò)誤頁面訪問
    function trackError(type) {
        const payload = {
            type: type,
            url: window.location.href,
            referrer: document.referrer,
            userAgent: navigator.userAgent,
            timestamp: new Date().toISOString(),
            language: userLang,
            screen: `${screen.width}x${screen.height}`,
            platform: navigator.platform
        };
        // 使用 beacon API 避免阻塞頁面加載
        if (navigator.sendBeacon) {
            navigator.sendBeacon('/api/analytics/error', JSON.stringify(payload));
        } else {
            // 降級(jí):使用 fetch,但不等待響應(yīng)
            fetch('/api/analytics/error', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(payload),
                keepalive: true
            }).catch(() => {});
        }
    }
    // 頁面加載完成后上報(bào)
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => trackError('unknown'));
    } else {
        trackError('unknown');
    }
    // 綁定“返回首頁”按鈕事件
    document.querySelectorAll('.btn[href="/" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ]').forEach(btn => {
        btn.addEventListener('click', () => {
            trackError('click_home');
        });
    });
    // 綁定“聯(lián)系我們”按鈕事件
    document.querySelectorAll('.btn[href="/contact" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ]').forEach(btn => {
        btn.addEventListener('click', () => {
            trackError('click_contact');
        });
    });
})();

Nginx + Java 動(dòng)態(tài)錯(cuò)誤頁面:實(shí)現(xiàn)真正的智能響應(yīng)

靜態(tài)頁面雖然優(yōu)雅,但缺乏“智能”。我們能否根據(jù)用戶語言、設(shè)備類型、訪問來源、甚至用戶身份,動(dòng)態(tài)生成錯(cuò)誤頁面?

答案是:完全可以!

架構(gòu)設(shè)計(jì):Nginx → Java 微服務(wù) → 動(dòng)態(tài) HTML

我們引入一個(gè)輕量級(jí) Java 微服務(wù),專門負(fù)責(zé)生成動(dòng)態(tài)錯(cuò)誤頁面。Nginx 將所有錯(cuò)誤請(qǐng)求重定向到 /error/dynamic,由 Java 服務(wù)處理并返回個(gè)性化內(nèi)容。

用戶請(qǐng)求 → Nginx → 404 → /error/dynamic → Java 服務(wù) → 動(dòng)態(tài) HTML → 返回給用戶

Java 服務(wù):Spring Boot 錯(cuò)誤頁面生成器

我們創(chuàng)建一個(gè)獨(dú)立的 Spring Boot 應(yīng)用,僅用于處理 /error/dynamic 路徑。

pom.xml(簡(jiǎn)化版)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yourcompany</groupId>
    <artifactId>error-page-service</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0</version>
        <relativePath/>
    </parent>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-java8time</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.yml

server:
  port: 8081
  servlet:
    context-path: /error
spring:
  thymeleaf:
    cache: false
    enabled: true
    prefix: classpath:/templates/
    suffix: .html
    mode: HTML
    encoding: UTF-8
logging:
  level:
    com.yourcompany: DEBUG

主啟動(dòng)類:ErrorPageApplication.java

package com.yourcompany.errorpage;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ErrorPageApplication {
    public static void main(String[] args) {
        SpringApplication.run(ErrorPageApplication.class, args);
    }
}

控制器:ErrorController.java

package com.yourcompany.errorpage.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
@Controller
@RequestMapping("/dynamic")
public class ErrorController {
    @GetMapping
    public String handleError(
            Model model,
            HttpServletRequest request,
            @RequestHeader(value = "Accept-Language", required = false) String acceptLanguage,
            @RequestParam(value = "code", required = false) String errorCode,
            @RequestParam(value = "url", required = false) String requestedUrl,
            @RequestParam(value = "referer", required = false) String referer
    ) {
        // 解析狀態(tài)碼
        int status = Optional.ofNullable(errorCode)
                .map(Integer::parseInt)
                .orElse(500);
        // 解析語言
        Locale locale = Optional.ofNullable(acceptLanguage)
                .map(lang -> Locale.forLanguageTag(lang.split(",")[0].trim()))
                .orElse(Locale.ENGLISH);
        // 構(gòu)建模型
        model.addAttribute("status", status);
        model.addAttribute("requestedUrl", requestedUrl);
        model.addAttribute("referer", referer);
        model.addAttribute("timestamp", LocalDateTime.now());
        model.addAttribute("locale", locale.getLanguage());
        model.addAttribute("userAgent", request.getHeader("User-Agent"));
        // 根據(jù)狀態(tài)碼選擇模板
        switch (status) {
            case 404:
                return "error/404";
            case 500:
                return "error/500";
            case 502:
                return "error/502";
            case 503:
                return "error/503";
            default:
                return "error/generic";
        }
    }
}

模板:src/main/resources/templates/error/404.html(Thymeleaf)

<!DOCTYPE html>
<html lang="thymeleaf: ${locale}" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title th:text="#{error.404.title}">Page Not Found</title>
    <link rel="stylesheet" href="/error/css/error.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
    <style>
        /* 同前文,保持樣式一致 */
        body { font-family: 'Segoe UI', sans-serif; background: #f8f9fa; }
        .emoji { font-size: 8rem; margin: 1rem 0; }
        h1 { font-size: 2.5rem; color: #333; }
        p { color: #666; font-size: 1.2rem; }
        .btn { padding: 0.8rem 1.5rem; border-radius: 50px; }
    </style>
</head>
<body>
<div class="error-container">
    <div class="emoji">??</div>
    <h1 th:text="#{error.404.heading}">Page Not Found</h1>
    <p th:text="#{error.404.description}">The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.</p>
    <ul style="text-align: left; display: inline-block; margin: 1.5rem auto; font-size: 1.1rem;">
        <li>?? <a href="/" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  th:text="#{error.404.link.home}">Home</a></li>
        <li>?? <a href="/search" rel="external nofollow"  th:text="#{error.404.link.search}">Search</a></li>
        <li>?? <a href="/contact" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  th:text="#{error.404.link.contact}">Contact Us</a></li>
    </ul>
    <a href="/" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="btn" th:text="#{error.404.btn.home}">Home</a>
    <a href="/contact" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="btn" style="background: #6c757d;" th:text="#{error.404.btn.contact}">Contact</a>
    <div class="footer">
        <p th:text="#{error.footer}">? 2025 YourCompany Inc. · Service Hotline: 400-123-4567</p>
        <p th:if="${requestedUrl}" th:text="|Requested: ${requestedUrl}|"></p>
        <p th:if="${referer}" th:text="|Referer: ${referer}|"></p>
    </div>
</div>
<script src="/error/js/error.js"></script>
<script th:inline="javascript">
    /*<![CDATA[*/
    document.addEventListener('DOMContentLoaded', function() {
        fetch('/api/analytics/error', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                type: [[${status}]],
                url: '[[${requestedUrl}]]',
                referrer: '[[${referer}]]',
                userAgent: navigator.userAgent,
                language: '[[${locale}]]',
                timestamp: new Date().toISOString()
            })
        }).catch(console.error);
    });
    /*]]>*/
</script>
</body>
</html>

國(guó)際化資源文件:src/main/resources/i18n/messages_zh_CN.properties

error.404.title=頁面找不到
error.404.heading=頁面不見了
error.404.description=抱歉,您訪問的頁面可能已被移除、改名,或暫時(shí)無法訪問。
error.404.link.home=返回首頁
error.404.link.search=使用搜索
error.404.link.contact=聯(lián)系我們
error.404.btn.home=回到首頁
error.404.btn.contact=獲取幫助
error.footer=? 2025 YourCompany Inc. · 服務(wù)熱線:400-123-4567

messages_en_US.properties

error.404.title=Page Not Found
error.404.heading=Page Not Found
error.404.description=The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.
error.404.link.home=Home
error.404.link.search=Search
error.404.link.contact=Contact Us
error.404.btn.home=Go Home
error.404.btn.contact=Contact Support
error.footer=? 2025 YourCompany Inc. · Service Hotline: 400-123-4567

messages_ja_JP.properties

error.404.title=ページが見つかりません
error.404.heading=ページが見つかりませんでした
error.404.description=お探しのページは削除されたか、名前が変更されたか、一時(shí)的に利用できない可能性があります。
error.404.link.home=ホーム
error.404.link.search=検索
error.404.link.contact=お問い合わせ
error.404.btn.home=ホームへ戻る
error.404.btn.contact=サポートへ連絡(luò)
error.footer=? 2025 YourCompany Inc. · サポート電話:400-123-4567

? Thymeleaf 優(yōu)勢(shì):支持國(guó)際化、條件渲染、安全轉(zhuǎn)義、模板繼承,完美替代傳統(tǒng) JSP。

Nginx 配置:將錯(cuò)誤請(qǐng)求代理到 Java 服務(wù)

現(xiàn)在,我們修改 Nginx 配置,讓所有錯(cuò)誤請(qǐng)求都通過 proxy_pass 轉(zhuǎn)發(fā)給 Java 服務(wù)。

server {
    listen 80;
    server_name example.com;
    # 靜態(tài)資源根目錄
    root /var/www/html;
    # 404 錯(cuò)誤:代理到 Java 服務(wù)
    error_page 404 = @error_dynamic;
    # 5xx 錯(cuò)誤:代理到 Java 服務(wù),并修改狀態(tài)碼為 200(SPA 兼容)
    error_page 500 502 503 504 =200 @error_dynamic;
    # 處理后端請(qǐng)求
    location @error_dynamic {
        internal;  # 只允許內(nèi)部調(diào)用
        # 構(gòu)建動(dòng)態(tài)請(qǐng)求參數(shù)
        set $err_code $status;
        set $err_url $request_uri;
        set $err_referer $http_referer;
        proxy_pass http://localhost:8081/error/dynamic?code=$err_code&url=$err_url&referer=$err_referer;
        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;
        proxy_set_header Accept-Language $http_accept_language;
        # 緩存策略:5xx 錯(cuò)誤頁面緩存 30 秒
        proxy_cache_valid 200 30s;
        proxy_cache_error 500 502 503 504 30s;
        proxy_cache_bypass $http_cache_control;
        proxy_cache_lock on;
        proxy_cache_lock_age 10s;
        proxy_cache_lock_timeout 5s;
        # 響應(yīng)頭:確保不緩存錯(cuò)誤頁面到客戶端
        add_header Cache-Control "no-cache, no-store, must-revalidate";
        add_header Pragma "no-cache";
        add_header Expires "0";
    }
    # 靜態(tài)錯(cuò)誤頁面 fallback(Java 服務(wù)宕機(jī)時(shí)使用)
    location /error/ {
        alias /var/www/errors;
        internal;
    }
    location / {
        try_files $uri $uri/ =404;
    }
}

Nginx 緩存策略詳解

指令作用
proxy_cache_valid 200 30s;對(duì) 200 響應(yīng)緩存 30 秒
proxy_cache_error 500 502 503 504 30s;對(duì) 5xx 錯(cuò)誤也緩存 30 秒(防止后端雪崩)
proxy_cache_lock on;避免“緩存擊穿”:多個(gè)請(qǐng)求同時(shí)命中未緩存資源時(shí),只讓一個(gè)請(qǐng)求去后端
proxy_cache_bypass若客戶端攜帶 Cache-Control: no-cache,則跳過緩存
add_header Cache-Control "no-cache"告訴瀏覽器不要緩存錯(cuò)誤頁

? 重要:即使后端 Java 服務(wù)掛了,Nginx 仍能返回靜態(tài)錯(cuò)誤頁(通過 location /error/),實(shí)現(xiàn)雙保險(xiǎn)機(jī)制。

多語言自動(dòng)識(shí)別與用戶偏好匹配

Java 服務(wù)通過 Accept-Language 請(qǐng)求頭自動(dòng)識(shí)別用戶語言。但用戶可能有多個(gè)語言偏好:

Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7

Thymeleaf 會(huì)自動(dòng)根據(jù) LocaleResolver 選擇最匹配的語言包。我們還可以在前端增強(qiáng)體驗(yàn):

<!-- 在頁面中動(dòng)態(tài)顯示當(dāng)前語言 -->
<p th:text="'當(dāng)前語言:' + ${locale}">當(dāng)前語言:zh-CN</p>
<!-- 提供語言切換按鈕(僅在用戶未登錄時(shí)顯示) -->
<div th:if="${not #authentication.principal}" style="margin-top: 2rem;">
    <a href="?lang=zh-CN" rel="external nofollow"  style="margin-right: 1rem;">???? 中文</a>
    <a href="?lang=en-US" rel="external nofollow"  style="margin-right: 1rem;">???? English</a>
    <a href="?lang=ja-JP" rel="external nofollow"  style="margin-right: 1rem;">???? 日本語</a>
</div>

?? 你可以結(jié)合 localStorage 記住用戶偏好,下次訪問時(shí)自動(dòng)應(yīng)用。

錯(cuò)誤頁面埋點(diǎn)與監(jiān)控:Java 后端分析服務(wù)

為了讓運(yùn)維團(tuán)隊(duì)能實(shí)時(shí)監(jiān)控錯(cuò)誤頁面的訪問情況,我們?cè)?Java 服務(wù)中添加一個(gè)獨(dú)立的分析端點(diǎn)。

AnalyticsController.java

package com.yourcompany.errorpage.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.Map;
@RestController
public class AnalyticsController {
    private static final Logger log = LoggerFactory.getLogger(AnalyticsController.class);
    @Value("${analytics.enabled:true}")
    private boolean analyticsEnabled;
    @PostMapping("/api/analytics/error")
    public void logError(@RequestBody Map<String, Object> payload) {
        if (!analyticsEnabled) return;
        log.info("ERROR ANALYTICS: {}", payload);
        // 可選:寫入 Kafka、Elasticsearch、或發(fā)送到 Prometheus
        // 這里僅打印日志,實(shí)際項(xiàng)目中應(yīng)異步寫入數(shù)據(jù)庫或消息隊(duì)列
        // 示例:寫入 CSV 日志文件
        // FileAppender.appendErrorLog(payload);
    }
}

日志輸出示例

ERROR ANALYTICS: {
  "type": "404",
  "url": "/api/v1/user/12345",
  "referrer": "https://google.com/search?q=yourcompany+products",
  "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X)",
  "language": "zh-CN",
  "timestamp": "2025-04-05T12:34:56.789Z",
  "screen": "375x812",
  "platform": "iPhone"
}

你可以將這些日志接入 ELK、Grafana Loki 或 Datadog,構(gòu)建錯(cuò)誤頁面訪問熱力圖:

測(cè)試與驗(yàn)證:如何確保配置正確?

1. 測(cè)試靜態(tài)頁面

curl -H "Accept-Language: zh-CN" http://localhost/error/404.html

應(yīng)返回完整 HTML。

2. 測(cè)試 Nginx 動(dòng)態(tài)代理

curl -H "Accept-Language: ja-JP" http://localhost/error/dynamic?code=404&url=/nonexistent

應(yīng)返回日文內(nèi)容。

3. 模擬 404 請(qǐng)求

curl -I http://localhost/nonexistent-path

檢查響應(yīng)頭:

HTTP/1.1 404 Not Found
Server: nginx
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache, no-store, must-revalidate

4. 模擬 500 錯(cuò)誤(測(cè)試 Java 服務(wù))

在 Java 服務(wù)中臨時(shí)拋出異常:

@GetMapping("/test/500")
public String test500() {
    throw new RuntimeException("Simulated 500 error");
}

訪問 http://localhost:8081/error/dynamic?code=500,觀察返回內(nèi)容。

性能優(yōu)化:如何讓錯(cuò)誤頁更快?

錯(cuò)誤頁面的加載速度,直接影響用戶流失率。以下是優(yōu)化策略:

? 1. 內(nèi)聯(lián)關(guān)鍵 CSS

將首屏渲染必需的 CSS 直接寫入 <style> 標(biāo)簽,避免阻塞渲染。

? 2. 使用 SVG 內(nèi)聯(lián)圖標(biāo)

<!-- 替代圖片 -->
<svg width="120" height="120" viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg">
  <circle cx="60" cy="60" r="50" fill="#f0f0f0"/>
  <path d="M40 40 L80 80 M80 40 L40 80" stroke="#ccc" stroke-width="4" fill="none"/>
</svg>

? 3. 壓縮 HTML

在 Nginx 中啟用 Gzip:

gzip on;
gzip_vary on;
gzip_min_length 1000;
gzip_types text/html application/json text/css application/javascript;

? 4. 使用 HTTP/2

確保 Nginx 啟用 HTTP/2,提升多資源并發(fā)加載效率:

listen 443 ssl http2;

? 5. 預(yù)加載關(guān)鍵資源(可選)

<link rel="preload" as="style" href="/error/css/error.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >

安全加固:防止錯(cuò)誤頁成為攻擊入口

1. 禁止直接訪問錯(cuò)誤頁路徑

location /error/ {
    alias /var/www/errors;
    internal;  # ?? 必須設(shè)置!
}

2. 過濾惡意參數(shù)

在 Java 控制器中校驗(yàn)參數(shù):

if (requestedUrl != null && requestedUrl.contains("..")) {
    requestedUrl = "/"; // 安全降級(jí)
}

3. 避免 XSS 注入

Thymeleaf 默認(rèn)自動(dòng)轉(zhuǎn)義變量:

<p th:text="${requestedUrl}">...</p> <!-- 安全! -->
<p th:utext="${requestedUrl}">...</p> <!-- 危險(xiǎn)!不要用 -->

4. 隱藏服務(wù)器信息

server_tokens off;

5. 設(shè)置 CSP(內(nèi)容安全策略)

<meta http-equiv="Content-Security-Policy" 
      content="default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline';">

多語言、多地區(qū)、多設(shè)備:真正的全球化支持

你是否想過,一個(gè)在德國(guó)訪問的用戶,看到的錯(cuò)誤頁應(yīng)該是德語?一個(gè)在印度使用安卓手機(jī)的用戶,是否需要更簡(jiǎn)化的布局?

我們可以通過以下方式實(shí)現(xiàn):

維度實(shí)現(xiàn)方式
語言Accept-Language 頭 + Thymeleaf 國(guó)際化
地區(qū)通過 IP 地理庫(如 MaxMind)識(shí)別國(guó)家,返回本地化文案
設(shè)備User-Agent 檢測(cè) → 移動(dòng)端隱藏復(fù)雜按鈕
登錄狀態(tài)通過 Cookie 判斷用戶是否登錄 → 顯示“聯(lián)系客服”按鈕
時(shí)間根據(jù)時(shí)區(qū)顯示“請(qǐng)?jiān)诠ぷ鲿r(shí)間聯(lián)系我們”
// 示例:根據(jù) IP 獲取國(guó)家
@GetMapping("/dynamic")
public String handleError(Model model, HttpServletRequest request) {
    String clientIp = getClientIp(request);
    String country = geoService.getCountry(clientIp); // 如:CN, JP, DE
    model.addAttribute("country", country);
    // 根據(jù)國(guó)家加載不同文案
    if ("JP".equals(country)) {
        model.addAttribute("supportPhone", "0120-123-456");
    } else if ("DE".equals(country)) {
        model.addAttribute("supportPhone", "+49 30 12345678");
    }
}

監(jiān)控與告警:當(dāng)錯(cuò)誤頁訪問激增時(shí)怎么辦?

錯(cuò)誤頁面訪問量的異常飆升,往往是系統(tǒng)問題的“前兆”。

場(chǎng)景可能原因建議響應(yīng)
404 暴增外部鏈接失效、爬蟲抓取、API 路徑變更檢查 Google Search Console、分析 referrer
500 暴增后端服務(wù)崩潰、數(shù)據(jù)庫連接池耗盡、緩存穿透立即查看 JVM 日志、數(shù)據(jù)庫慢查詢
502 暴增后端服務(wù)重啟、負(fù)載均衡失效檢查后端健康檢查、重啟服務(wù)
503 暴增限流觸發(fā)、CDN 回源失敗檢查 QPS、帶寬、上游服務(wù)響應(yīng)時(shí)間

告警規(guī)則示例(Prometheus + Alertmanager)

groups:
- name: error-page-alerts
  rules:
  - alert: High404Rate
    expr: rate(error_page_requests{type="404"}[5m]) > 10
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "404 錯(cuò)誤率超過 10 次/分鐘"
      description: "最近5分鐘內(nèi),錯(cuò)誤頁面訪問量達(dá)到 {{ $value }} 次/秒,可能有死鏈或爬蟲攻擊。"
  - alert: High5xxRate
    expr: rate(error_page_requests{type=~"500|502|503|504"}[5m]) > 5
    for: 2m
    labels:
      severity: critical
    annotations:
      summary: "5xx 錯(cuò)誤率異常升高"
      description: "后端服務(wù)穩(wěn)定性下降,需立即排查。"

擴(kuò)展:動(dòng)態(tài)生成 SVG 插畫(無圖版)

你可能希望錯(cuò)誤頁有插畫,但不想使用圖片鏈接。我們可以用 Java 動(dòng)態(tài)生成 SVG 內(nèi)容!

@GetMapping("/dynamic")
public String handleError(Model model) {
    String svg = """
        <svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
          <circle cx="100" cy="100" r="90" fill="#f0f0f0"/>
          <path d="M60,60 L140,140 M140,60 L60,140" stroke="#ccc" stroke-width="4" fill="none"/>
          <text x="100" y="180" text-anchor="middle" font-size="14" fill="#666">找不到?</text>
        </svg>
        """;
    model.addAttribute("customSvg", svg);
    return "error/404";
}

在模板中:

<div th:utext="${customSvg}"></div>

完全無外部依賴,體積小,可縮放,SEO 友好。

總結(jié):構(gòu)建企業(yè)級(jí)錯(cuò)誤頁面的最佳實(shí)踐清單

類別實(shí)踐建議
? 設(shè)計(jì)原則溫暖、清晰、有引導(dǎo)、無恐慌
? 技術(shù)架構(gòu)Nginx + Java 動(dòng)態(tài)渲染 + 靜態(tài) fallback
? 語言支持Thymeleaf + 國(guó)際化資源文件
? 性能優(yōu)化內(nèi)聯(lián) CSS、SVG 圖標(biāo)、Gzip、HTTP/2
? 安全加固internal 指令、CSP、參數(shù)過濾、隱藏 server token
? 監(jiān)控埋點(diǎn)異步上報(bào)訪問日志、集成分析平臺(tái)
? 容災(zāi)設(shè)計(jì)Java 服務(wù)宕機(jī)時(shí),自動(dòng)降級(jí)到靜態(tài)頁
? 全球化支持 IP 地理定位、時(shí)區(qū)、本地聯(lián)系方式
? 可維護(hù)性模板與樣式分離、版本控制、CI/CD 自動(dòng)部署

結(jié)語:錯(cuò)誤頁面,是用戶旅程的“溫柔轉(zhuǎn)折點(diǎn)”

我們常常把精力集中在首頁、登錄頁、支付流程上,卻忽略了那些“失敗”的瞬間。但正是這些時(shí)刻,決定了用戶是否愿意再給你一次機(jī)會(huì)。

一個(gè)精心設(shè)計(jì)的 404 頁面,不只是一個(gè)“錯(cuò)誤提示”,它是一次情感修復(fù)、一次品牌關(guān)懷、一次技術(shù)自信的展示。

 “最好的錯(cuò)誤頁面,是讓用戶感覺‘不是我錯(cuò)了,而是系統(tǒng)在幫我’。”

當(dāng)你看到一個(gè)用戶在 404 頁面停留了 12 秒,點(diǎn)擊了“返回首頁”,然后繼續(xù)瀏覽——你就知道,你贏了。

這不是技術(shù)的勝利,是人性的勝利。

以上就是Nginx自定義錯(cuò)誤頁面樣式與內(nèi)容的配置方法的詳細(xì)內(nèi)容,更多關(guān)于Nginx自定義錯(cuò)誤頁面樣式與內(nèi)容的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • nginx基礎(chǔ)配置說明一則

    nginx基礎(chǔ)配置說明一則

    nginx基礎(chǔ)配置說明一則,有需要的朋友可以參考下
    2013-02-02
  • Nginx啟用GZIP壓縮網(wǎng)頁傳輸方法(推薦)

    Nginx啟用GZIP壓縮網(wǎng)頁傳輸方法(推薦)

    Gzip壓縮我很早已經(jīng)就啟用了,不過從未與大家分享過。今天小編給大家分享Nginx啟用GZIP壓縮網(wǎng)頁傳輸方法,需要的朋友參考下吧
    2017-01-01
  • 實(shí)現(xiàn)nginx&php服務(wù)器配置的非主流配置方法

    實(shí)現(xiàn)nginx&php服務(wù)器配置的非主流配置方法

    這種方法并非以前所流行的apache 加 php_module 的方式運(yùn)行,我是采用nginx 作為web服務(wù)器,以fastcgi的方式運(yùn)行php
    2011-05-05
  • Ubuntu服務(wù)器已下載Nginx安裝包的安裝步驟(最新推薦)

    Ubuntu服務(wù)器已下載Nginx安裝包的安裝步驟(最新推薦)

    在Ubuntu服務(wù)器上安裝已下載的 Nginx,需完成依賴安裝、解壓編譯、配置安裝及服務(wù)驗(yàn)證等步驟,本文給大家介紹Ubuntu服務(wù)器已下載Nginx安裝包的安裝步驟,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Nginx構(gòu)建Tomcat集群的操作方法

    Nginx構(gòu)建Tomcat集群的操作方法

    nginx是一款自由的、開源的、高性能的HTTP服務(wù)器和反向代理服務(wù)器;同時(shí)也是一個(gè)IMAP、POP3、SMTP代理服務(wù)器,這篇文章主要介紹了Nginx構(gòu)建Tomcat集群的問題,需要的朋友可以參考下
    2022-01-01
  • Nginx幾種負(fù)載均衡模式的實(shí)現(xiàn)示例

    Nginx幾種負(fù)載均衡模式的實(shí)現(xiàn)示例

    本文主要介紹了Nginx幾種負(fù)載均衡模式的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-10-10
  • Nginx代理Partainer的具體使用

    Nginx代理Partainer的具體使用

    本文主要介紹了Nginx代理Partainer的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Nginx使用Lua模塊實(shí)現(xiàn)WAF的原理解析

    Nginx使用Lua模塊實(shí)現(xiàn)WAF的原理解析

    waf是通過執(zhí)行一系列針對(duì)HTTP/HTTPS的安全策略來專門為Web應(yīng)用提供保護(hù)的一款產(chǎn)品,本文重點(diǎn)給大家介紹Nginx使用Lua模塊實(shí)現(xiàn)WAF的原理,需要的朋友參考下吧
    2021-09-09
  • 使用?nginx?搭建代理服務(wù)器(正向代理?https?網(wǎng)站)的詳細(xì)步驟

    使用?nginx?搭建代理服務(wù)器(正向代理?https?網(wǎng)站)的詳細(xì)步驟

    這篇文章主要介紹了使用?nginx?搭建代理服務(wù)器(正向代理?https?網(wǎng)站)指南的相關(guān)操作,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Nginx服務(wù)器Nginx.com配置文件詳解

    Nginx服務(wù)器Nginx.com配置文件詳解

    這篇文章主要介紹了Nginx服務(wù)器Nginx.com配置文件詳解的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09

最新評(píng)論

铜山县| 黔东| 府谷县| 五莲县| 喜德县| 抚顺县| 广灵县| 临桂县| 邵武市| 罗平县| 右玉县| 东山县| 安丘市| 永州市| 兴文县| 天峨县| 偃师市| 定兴县| 丹巴县| 广水市| 定安县| 蚌埠市| 遂昌县| 泰来县| 黔西| 彭泽县| 甘洛县| 寿宁县| 西充县| 韩城市| 平陆县| 龙南县| 遂溪县| 驻马店市| 无极县| 淮北市| 阿拉善右旗| 天台县| 泰和县| 阳曲县| 慈利县|