從零手寫實現 nginx-28-error pages 指令

前言

大家好,我是老馬。很高興遇到你。

我們為 java 開發者實現了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何處理的,可以參考我的另一個項目:

手寫從零實現簡易版 tomcat minicat

手寫 nginx 系列

如果你對 nginx 原理感興趣,可以閱讀:

從零手寫實現 nginx-01-為什么不能有 java 版本的 nginx?

從零手寫實現 nginx-02-nginx 的核心能力

從零手寫實現 nginx-03-nginx 基于 Netty 實現

從零手寫實現 nginx-04-基于 netty http 出入參優化處理

從零手寫實現 nginx-05-MIME類型(Multipurpose Internet Mail Extensions,多用途互聯網郵件擴展類型)

從零手寫實現 nginx-06-文件夾自動索引

從零手寫實現 nginx-07-大文件下載

從零手寫實現 nginx-08-范圍查詢

從零手寫實現 nginx-09-文件壓縮

從零手寫實現 nginx-10-sendfile 零拷貝

從零手寫實現 nginx-11-file+range 合并

從零手寫實現 nginx-12-keep-alive 連接復用

從零手寫實現 nginx-13-nginx.conf 配置文件介紹

從零手寫實現 nginx-14-nginx.conf 和 hocon 格式有關系嗎?

從零手寫實現 nginx-15-nginx.conf 如何通過 java 解析處理?

從零手寫實現 nginx-16-nginx 支持配置多個 server

從零手寫實現 nginx-17-nginx 默認配置優化

從零手寫實現 nginx-18-nginx 請求頭+響應頭操作

從零手寫實現 nginx-19-nginx cors

從零手寫實現 nginx-20-nginx 占位符 placeholder

從零手寫實現 nginx-21-nginx modules 模塊信息概覽

從零手寫實現 nginx-22-nginx modules 分模塊加載優化

從零手寫實現 nginx-23-nginx cookie 的操作處理

從零手寫實現 nginx-24-nginx IF 指令

從零手寫實現 nginx-25-nginx map 指令

從零手寫實現 nginx-26-nginx rewrite 指令

從零手寫實現 nginx-27-nginx return 指令

從零手寫實現 nginx-28-nginx error_pages 指令

從零手寫實現 nginx-29-nginx try_files 指令

nginx 的 error_page 指令

nginxerror_page 指令用于定義自定義錯誤頁面。

當服務器遇到錯誤時,nginx 會根據配置返回自定義的錯誤頁面,而不是默認的錯誤頁面。這在提高用戶體驗和品牌一致性方面非常有用。

error_page 指令語法

error_page code [code ...] [=[response]] uri;
  • code:HTTP 狀態碼,可以是單個狀態碼或多個狀態碼,表示哪些錯誤狀態碼會觸發自定義錯誤頁面。
  • =[response]:可選參數,表示在返回自定義錯誤頁面時,是否改變 HTTP 響應狀態碼。
  • uri:指定自定義錯誤頁面的 URI,可以是相對路徑或絕對路徑。

示例和解釋

基本用法
  1. 單個錯誤代碼
error_page 404 /custom_404.html;

當服務器返回 404 錯誤時,nginx 會返回 /custom_404.html 這個頁面。

  1. 多個錯誤代碼
error_page 500 502 503 504 /custom_5xx.html;

當服務器返回 500, 502, 503 或 504 錯誤時,nginx 會返回 /custom_5xx.html 這個頁面。

改變響應狀態碼

有時,你可能希望在重定向到自定義錯誤頁面時,改變 HTTP 響應狀態碼。例如,將 404 錯誤重定向到一個頁面,但返回 200 狀態碼。

error_page 404 =200 /custom_404.html;

當服務器返回 404 錯誤時,nginx 會返回 /custom_404.html 頁面,但 HTTP 響應狀態碼是 200。

使用內部重定向

可以使用 @named_location 來處理錯誤。這個方法允許你將錯誤處理邏輯封裝在一個內部位置。

error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;
}

當服務器返回 500, 502, 503 或 504 錯誤時,nginx 會將請求內部重定向到 /50x.html。此時,/50x.html 頁面存放在 /usr/share/nginx/html 目錄下。

高級用法

自定義錯誤頁面與代理服務器結合

當你使用 nginx 作為反向代理服務器時,也可以定義自定義錯誤頁面。例如,當后端服務器不可用時,顯示友好的錯誤頁面。

server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_intercept_errors on;error_page 500 502 503 504 /custom_50x.html;}location = /custom_50x.html {root /usr/share/nginx/html;}
}

在這個例子中,當后端服務器返回 500, 502, 503 或 504 錯誤時,nginx 會攔截這些錯誤并返回自定義的 /custom_50x.html 頁面。

常見錯誤代碼

以下是一些常見的 HTTP 錯誤代碼及其含義:

  • 400:Bad Request(錯誤請求)
  • 401:Unauthorized(未授權)
  • 403:Forbidden(禁止訪問)
  • 404:Not Found(未找到)
  • 500:Internal Server Error(內部服務器錯誤)
  • 502:Bad Gateway(錯誤網關)
  • 503:Service Unavailable(服務不可用)
  • 504:Gateway Timeout(網關超時)

示例:完整的 Nginx 配置文件

server {listen 80;server_name example.com;location / {try_files $uri $uri/ =404;}error_page 404 /custom_404.html;error_page 500 502 503 504 /custom_50x.html;location = /custom_404.html {root /usr/share/nginx/html;}location = /custom_50x.html {root /usr/share/nginx/html;}
}

結論

nginxerror_page 指令非常靈活,允許你根據需要自定義錯誤頁面,以改善用戶體驗和提供更友好的錯誤消息。

通過使用該指令,你可以輕松地創建品牌一致的錯誤頁面,并將其集成到現有的 nginx 配置中。

java error_page

error_page 指令的處理

package com.github.houbb.nginx4j.config.param.impl.dispatch;import com.github.houbb.heaven.util.util.CollectionUtil;
import com.github.houbb.log.integration.core.Log;
import com.github.houbb.log.integration.core.LogFactory;
import com.github.houbb.nginx4j.config.NginxCommonConfigEntry;
import com.github.houbb.nginx4j.config.NginxConfig;
import com.github.houbb.nginx4j.config.param.AbstractNginxParamLifecycleDispatch;
import com.github.houbb.nginx4j.exception.Nginx4jException;
import com.github.houbb.nginx4j.support.errorpage.INginxErrorPageManage;
import com.github.houbb.nginx4j.support.request.dispatch.NginxRequestDispatchContext;import java.util.List;/*** 參數處理類 響應頭處理** @since 0.25.0* @author 老馬嘯西風*/
public class NginxParamHandleErrorPage extends AbstractNginxParamLifecycleDispatch {private static final Log logger = LogFactory.getLog(NginxParamHandleErrorPage.class);@Overridepublic boolean doBeforeDispatch(NginxCommonConfigEntry configParam, NginxRequestDispatchContext context) {List<String> values = configParam.getValues();if(CollectionUtil.isEmpty(values) || values.size() < 2) {throw new Nginx4jException("error_page 必須包含2個參數");}NginxConfig nginxConfig = context.getNginxConfig();INginxErrorPageManage nginxErrorPageManage = nginxConfig.getNginxErrorPageManage();// 直接拆分String lastHtml = values.get(values.size()-1);for(int i = 0; i < values.size()-1; i++) {String code = values.get(i);nginxErrorPageManage.register(code, lastHtml);}return true;}@Overridepublic boolean doAfterDispatch(NginxCommonConfigEntry configParam, NginxRequestDispatchContext context) {return true;}@Overrideprotected String getKey(NginxCommonConfigEntry configParam, NginxRequestDispatchContext context) {return "error_page";}@Overridepublic String directiveName() {return "error_page";}}

定義 error_page 映射關系的存儲

package com.github.houbb.nginx4j.support.errorpage;import com.github.houbb.log.integration.core.Log;
import com.github.houbb.log.integration.core.LogFactory;import java.util.HashMap;
import java.util.Map;/*** @since 0.25.0* @author 老馬嘯西風*/
public class NginxErrorPageManageDefault implements INginxErrorPageManage {private static final Log logger = LogFactory.getLog(NginxErrorPageManageDefault.class);private final Map<String, String> map = new HashMap<>();@Overridepublic void register(String code, String htmlPath) {map.put(code, htmlPath);logger.info("error_page register code={}, path={}", code, htmlPath);}@Overridepublic String getPath(String code) {String path = map.get(code);logger.info("error_page register code={}, path={}", code, path);return path;}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45097.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

夾子音轉換器matlab

操作過程點擊此處觀看 上段時間補習了一下傅里葉變化的知識&#xff0c;突發奇想可以根據此做一款聲音轉換器&#xff0c;使用工科神器Matlab進行完成&#xff0c;并且開發了可操作界面如下圖所示&#xff1a; 功能實現與描述 軟件中可以實現聲音的錄制、回放、文件的保存與…

【C++】動態內存分配(關于構造與析構函數的調用)動態數組類 動態創建多維數組 知識點+代碼學習記錄

一.動態內存分配相關知識點 1.堆和棧內存&#xff1a; 堆內存&#xff1a;動態分配的內存位于堆中&#xff0c;它不受作用域限制&#xff0c;由程序員控制其生命周期。 棧內存&#xff1a;局部變量和函數參數等自動分配的內存位于棧中&#xff0c;由編譯器自動管理。 2.new…

性能測試(2)

jmeter參數化 loadrunner Jmeter IP欺騙&#xff0c;也稱為IP欺詐&#xff0c;是指通過偽裝、篡改IP地址的方式&#xff0c;進行網絡攻擊或欺騙行為。這種行為可能會導致網絡安全問題&#xff0c;包括身份盜竊、數據泄露、DDoS攻擊等。為了保護自己的網絡安全&#xff0c;用戶…

MySQL-表的約束

文章目錄 一、空屬性二、默認值三、zerofill四、列描述五、主鍵刪除主鍵追加主鍵復合主鍵根據主鍵快速索引 六、自增長last_insert_id() 七、唯一鍵八、外鍵class表&#xff08;主表&#xff09;student表&#xff08;從表&#xff09; 一、空屬性 之前我們將表的機構&#xff…

單例模式java

并發的有序性會導致返回空指針 class A{private static volatil A a;private A(){}public A getInstance(){if(anull){synchronized(A.class){if(anull)anew A();}}return a; }anew A();這條語句&#xff0c;他需要&#xff1a;開辟空間&#xff0c;初始化空間&#xff0c;指針…

python熱門面試題三

面試題1&#xff1a;Python中的列表推導式是什么&#xff1f;請給出一個例子。 回答&#xff1a; 列表推導式&#xff08;List Comprehension&#xff09;是Python中一種非常強大且簡潔的構建列表的工具。它允許你通過一個表達式來創建一個新的列表&#xff0c;這個表達式定義…

無顯卡也可以玩大模型-MiniGPT-4篇

MiniGPT-4學習 1.Colab上部署MiniGPT-42.論文摘要3.模型架構4.模型訓練5.總結 1.Colab上部署MiniGPT-4 代碼&#xff1a; https://github.com/Czi24/Awesome-MLLM-LLM-Colab/blob/master/MLLM/MiniGPT-4-colab/MiniGPT-4.md 2.論文摘要 最近的 GPT-4 展示了非凡的多模式能力&…

【設計模式之美】【建造型】工廠模式:通過面向接口編程思路,串起業務流程

文章目錄 一. 簡單工廠&#xff08;Simple Factory&#xff09;第一種簡單工廠&#xff1a;面向接口編程與工廠類&#xff1a;劃分功能職責第二種&#xff1a;單例簡單工廠&#xff1a;節省內存和對象創建的時間 二. 工廠方法&#xff08;Factory Method&#xff09;&#xff1…

文心一言:如何備考軟考架構師

提問&#xff1a;軟考高級:架構師指導&#xff0c;有哪些考點、重點考點有哪些&#xff1f;需要如何備考&#xff1f;案例分析題如何做&#xff1f;論文如何寫&#xff1f; 文心一言回答1700字如下&#xff1a; 針對軟考高級架構師的考試&#xff0c;以下是對考點、重點考點、備…

DiffusionModel-Transformer知識回顧

論文鏈接&#xff1a; Attention Is All You Need CNN vs RNN vs Transformer CNN&#xff08;卷積神經網絡&#xff09; 特點&#xff1a; 局部連接&#xff1a;每個卷積神經元只與輸入數據的局部區域連接&#xff0c;這有助于捕捉局部特征。權重共享&#xff1a;卷積核的權重…

Android筆記:Constructor (xxx) has been changed after generation.

遇到此報錯時&#xff0c;onstructor (xxx) has been changed after generation.是因為修改了實體類字段后什么都不修改的話就會報這個錯 這條信息是關于代碼生成和代碼變更的警告。當你使用某些工具&#xff08;如注解處理器、代碼生成庫等&#xff09;來自動生成代碼時&…

運行在Linux上的程序越來越慢的排查思路

1、通過free -h 排查內存使用情況&#xff0c;是否內存滿了 2、通過df -h 排查磁盤的使用情況&#xff0c;磁盤是否沒有空間了 3、檢查系統資源配置情況&#xff0c;比如使用ulimit -a檢查當前會話的資源限制&#xff0c;如最大文件數、打開文件描述符數等&#xff0c;看是否…

清華計算幾何-ConvexHull(凸包)-求極點InTriangle/ToLeft Test

ConvexHull(凸包) 凸包是什么 凸包是計算幾何一個非常基礎核心的概念。我理解的凸包就是給定一個點集合, 最外圍的點的包圍體就是凸包。如下所示: 極點(ExtremityPoint) 給定的點集合中, 如果一個點存在一條直線, 讓其他所有點都在于該直線的同一側, 則該點為極點。 非極點 …

如何理解electron 的預加載腳本

在 Electron 應用中,預加載腳本(Preload Script)是一個非常重要的概念,它允許你在渲染進程(web 頁面)和主進程之間創建一個安全的橋梁。預加載腳本運行在 Node.js 環境中,但位于渲染進程的一個單獨的上下文中,這意味著它可以訪問 Node.js 的 API,但無法直接訪問 DOM。…

JavaScript進階(7) ----構造函數和原型對象

目錄 構造函數 prototype 定義&#xff1a; 使用場景&#xff1a; constructor 使用場景&#xff1a; 原型proto 原型鏈 定義 特點 instanceof 運算符 原型繼承的基本概念 在JavaScript中&#xff0c;構造函數和原型是面向對象編程的核心概念&#xff0c;它們共同構…

海康工業相機驅動

1.新建基于對話框的MFC程序&#xff0c;界面布局如下 2.修改控件ID&#xff0c;為控件綁定變量 3.創建全局變量&#xff0c;構造函數中初始化變量&#xff0c;初始化對話框界面&#xff0c;補齊各控件按鈕響應函數 全文程序如下&#xff1a; // MFC_GrabimageDlg.h : 頭文件 /…

【動態規劃Ⅰ】斐波那契、爬樓梯、楊輝三角

動態規劃—斐波那契系列 什么是動態規劃斐波那契數組相關題目509. 斐波那契數 Easy1137. 第 N 個泰波那契數 Easy 楊輝三角118. 楊輝三角 Easy 爬樓梯相關題目70. 爬樓梯 Easy746. 使用最小花費爬樓梯 Easy 什么是動態規劃 動態規劃是一種通過將原問題分解為相對簡單的子問題來…

linux下解壓命令

在Linux下&#xff0c;解壓縮文件通常涉及多種命令&#xff0c;具體取決于文件的壓縮格式。以下是一些常用的解壓縮命令&#xff1a; tar.gz / .tgz 如果文件擴展名為 .tar.gz 或 .tgz&#xff0c;你可以使用 tar 命令來解壓縮&#xff1a; tar -xzf filename.tar.gz這里的 -x …

近期幾首小詩匯總-生活~卷

生活 為生活飄零&#xff0c;風雨都不阻 路見盲人艱&#xff0c;為她心點燈 賀中科大家長論壇成立十五周年 科學家園有喜賀 園外丑漢翹望中 曾一學子入我科 正育科二盼長大 憧憬也能入此家 與科學家論短長 園外翹首聽高論 發現有隙入此壇 竟然也能注冊成 入園瀏覽惶然立 此貼…

系統架構的基礎:定義、原則與發展歷程

目錄 1. 系統架構的定義 2. 系統架構的基本組成部分 2.1 架構層次 2.2 架構視圖 2.3 架構原則 3. 系統架構的發展歷程 3.1 初期階段:單體架構(Monolithic Architecture) 3.2 面向對象和組件化階段 3.3 客戶端-服務器架構(Client-Server Architecture) 3.4 三層架…