其實很久沒碰過nginx了,突然來了個任務就只能硬著頭皮上了。
先說下背景:
我們業務采用的是容器的形式部署,nginx做反代的結構,當用戶請求到達nginx服務器時,先判斷nginx配置的根目錄下是否存在對應的靜態文件,不存在則進行轉發。
在nginx中配置了error_page 404的跳轉規則,預期效果是請求資源/路徑不存在時,跳轉到我們自定義的404頁面,而不是那大大的還加粗了的冷冰冰的"404 Not found"。
具體配置段如下:
error_page 404 500 /404.html; #定義狀態碼為404 500時的展示頁面
location = /404.html{
root /usr/share/nginx/html;#此資源的位置
}
剛開始的想法是,location已經有很多正確匹配到資源路徑的處理規則,而優先級最低的location / {規則X}
表示未能匹配到的資源按規則X
處理。
好吧,那就直接return 404不就可以了?
結果還真的是可以,但是。。。正確頁面加載不出來了,F12進入調試模式,發現頁面中很多資源請求也成是404了,尷尬沒考慮到這個問題,暫先放棄這個想法。
現在問題是nginx服務器上的默認404頁面文件已經被刪掉了,而且仔細觀察,發現更奇怪的是,下面的nginx版本號信息顯示的是1.13.0,而這個服務器的版本是1.12.2??!
冷靜,一定要冷靜
行吧,看來問題已經可以基本定位了,此時是由nginx代理的backend集群里中某一臺響應的404頁面,而不是由我們所設想的那樣,nginx-server直接響應自定義的404頁面。
好吧原因找到了,就看看有沒有相關方法能阻止一下了。。查各種資料后終于找到兩個有關的參數,而且好巧不巧這兩個參數默認是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
嘛意思呢?大概就是當后端服務器的響應狀態碼大于等于300時,決定是否直接將響應發送給客戶端,亦或將響應轉發給nginx由error_page指令來處理。
當為on時,nginx會攔截error_page指令明確指定的錯誤狀態碼。如果來自被代理服務器的應答狀態碼不匹配error_page指令,應答會照常發送到客戶端。
開啟后,check并reload下配置文件。再次測試,成功!而且正常頁面也能訪問。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。