其實(shí)很久沒(méi)碰過(guò)nginx了,突然來(lái)了個(gè)任務(wù)就只能硬著頭皮上了。
先說(shuō)下背景:
我們業(yè)務(wù)采用的是容器的形式部署,nginx做反代的結(jié)構(gòu),當(dāng)用戶請(qǐng)求到達(dá)nginx服務(wù)器時(shí),先判斷nginx配置的根目錄下是否存在對(duì)應(yīng)的靜態(tài)文件,不存在則進(jìn)行轉(zhuǎn)發(fā)。
在nginx中配置了error_page 404的跳轉(zhuǎn)規(guī)則,預(yù)期效果是請(qǐng)求資源/路徑不存在時(shí),跳轉(zhuǎn)到我們自定義的404頁(yè)面,而不是那大大的還加粗了的冷冰冰的"404 Not found"。
具體配置段如下:
為隆安等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及隆安網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為做網(wǎng)站、網(wǎng)站制作、隆安網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
error_page 404 500 /404.html; #定義狀態(tài)碼為404 500時(shí)的展示頁(yè)面
location = /404.html{
root /usr/share/nginx/html;#此資源的位置
}
剛開(kāi)始的想法是,location已經(jīng)有很多正確匹配到資源路徑的處理規(guī)則,而優(yōu)先級(jí)最低的location / {規(guī)則X}
表示未能匹配到的資源按規(guī)則X
處理。
好吧,那就直接return 404不就可以了?
結(jié)果還真的是可以,但是。。。正確頁(yè)面加載不出來(lái)了,F(xiàn)12進(jìn)入調(diào)試模式,發(fā)現(xiàn)頁(yè)面中很多資源請(qǐng)求也成是404了,尷尬沒(méi)考慮到這個(gè)問(wèn)題,暫先放棄這個(gè)想法。
現(xiàn)在問(wèn)題是nginx服務(wù)器上的默認(rèn)404頁(yè)面文件已經(jīng)被刪掉了,而且仔細(xì)觀察,發(fā)現(xiàn)更奇怪的是,下面的nginx版本號(hào)信息顯示的是1.13.0,而這個(gè)服務(wù)器的版本是1.12.2啊!
冷靜,一定要冷靜
行吧,看來(lái)問(wèn)題已經(jīng)可以基本定位了,此時(shí)是由nginx代理的backend集群里中某一臺(tái)響應(yīng)的404頁(yè)面,而不是由我們所設(shè)想的那樣,nginx-server直接響應(yīng)自定義的404頁(yè)面。
好吧原因找到了,就看看有沒(méi)有相關(guān)方法能阻止一下了。。查各種資料后終于找到兩個(gè)有關(guān)的參數(shù),而且好巧不巧這兩個(gè)參數(shù)默認(rèn)是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
嘛意思呢?大概就是當(dāng)后端服務(wù)器的響應(yīng)狀態(tài)碼大于等于300時(shí),決定是否直接將響應(yīng)發(fā)送給客戶端,亦或?qū)㈨憫?yīng)轉(zhuǎn)發(fā)給nginx由error_page指令來(lái)處理。
當(dāng)為on時(shí),nginx會(huì)攔截error_page指令明確指定的錯(cuò)誤狀態(tài)碼。如果來(lái)自被代理服務(wù)器的應(yīng)答狀態(tài)碼不匹配error_page指令,應(yīng)答會(huì)照常發(fā)送到客戶端。
開(kāi)啟后,check并reload下配置文件。再次測(cè)試,成功!而且正常頁(yè)面也能訪問(wèn)。