溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

記一次nginx配置自定義錯誤頁面的麻瓜經(jīng)歷

發(fā)布時間:2020-06-28 12:56:57 來源:網(wǎng)絡(luò) 閱讀:5038 作者:whj3656 欄目:建站服務(wù)器

其實很久沒碰過nginx了,突然來了個任務(wù)就只能硬著頭皮上了。
先說下背景:
我們業(yè)務(wù)采用的是容器的形式部署,nginx做反代的結(jié)構(gòu),當用戶請求到達nginx服務(wù)器時,先判斷nginx配置的根目錄下是否存在對應(yīng)的靜態(tài)文件,不存在則進行轉(zhuǎn)發(fā)。
在nginx中配置了error_page 404的跳轉(zhuǎn)規(guī)則,預(yù)期效果是請求資源/路徑不存在時,跳轉(zhuǎn)到我們自定義的404頁面,而不是那大大的還加粗了的冷冰冰的"404 Not found"。
具體配置段如下:

error_page 404 500 /404.html; #定義狀態(tài)碼為404 500時的展示頁面
location = /404.html{
    root /usr/share/nginx/html;#此資源的位置
}

剛開始的想法是,location已經(jīng)有很多正確匹配到資源路徑的處理規(guī)則,而優(yōu)先級最低的location / {規(guī)則X}表示未能匹配到的資源按規(guī)則X處理。
好吧,那就直接return 404不就可以了?
結(jié)果還真的是可以,但是。。。正確頁面加載不出來了,F(xiàn)12進入調(diào)試模式,發(fā)現(xiàn)頁面中很多資源請求也成是404了,尷尬沒考慮到這個問題,暫先放棄這個想法。

現(xiàn)在問題是nginx服務(wù)器上的默認404頁面文件已經(jīng)被刪掉了,而且仔細觀察,發(fā)現(xiàn)更奇怪的是,下面的nginx版本號信息顯示的是1.13.0,而這個服務(wù)器的版本是1.12.2啊!
記一次nginx配置自定義錯誤頁面的麻瓜經(jīng)歷
記一次nginx配置自定義錯誤頁面的麻瓜經(jīng)歷

冷靜,一定要冷靜
行吧,看來問題已經(jīng)可以基本定位了,此時是由nginx代理的backend集群里中某一臺響應(yīng)的404頁面,而不是由我們所設(shè)想的那樣,nginx-server直接響應(yīng)自定義的404頁面。
好吧原因找到了,就看看有沒有相關(guān)方法能阻止一下了。。查各種資料后終于找到兩個有關(guān)的參數(shù),而且好巧不巧這兩個參數(shù)默認是off的。
fastcgi_intercept_errors 和 proxy_intercept_errors

以下是官方介紹:

Syntax: fastcgi_intercept_errors on | off;
Default:    
fastcgi_intercept_errors off;
Context:    http, server, location
Determines whether FastCGI server responses with codes greater than or equal to 300 should be passed to a client or be intercepted and redirected to nginx for processing with the error_page directive.

友情鏈接:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_intercept_errors

Syntax: proxy_intercept_errors on | off;
Default:    
proxy_intercept_errors off;
Context:    http, server, location
Determines whether proxied responses with codes greater than or equal to 300 should be passed to a client or be intercepted and redirected to nginx for processing with the error_page directive.

友情鏈接:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
嘛意思呢?大概就是當后端服務(wù)器的響應(yīng)狀態(tài)碼大于等于300時,決定是否直接將響應(yīng)發(fā)送給客戶端,亦或?qū)㈨憫?yīng)轉(zhuǎn)發(fā)給nginx由error_page指令來處理。
當為on時,nginx會攔截error_page指令明確指定的錯誤狀態(tài)碼。如果來自被代理服務(wù)器的應(yīng)答狀態(tài)碼不匹配error_page指令,應(yīng)答會照常發(fā)送到客戶端。

開啟后,check并reload下配置文件。再次測試,成功!而且正常頁面也能訪問。
記一次nginx配置自定義錯誤頁面的麻瓜經(jīng)歷

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI