Nginx至少存在兩種不同的配置來指定錯誤頁面:
使用try_files配置項。
使用error_page配置項。
先介紹使用try_files配置項的情況。
Nginx提供的try_files配置允許在一個location中指定多個潛在的可能的響應頁面,Nginx將按照定義的次序依次嘗試訪問這些響應頁面,直到成功訪問該頁面。根據這個機制,可以在try_files配置的頁面列表的最后面加上一個頁面作為默認的錯誤頁面。
配置內容:
location /abc {
root html;
try_files $uri /404.html;
}
運行結果:
當請求存在的頁面時,將正常訪問該頁面。當訪問到不存在的頁面時,將跳轉到/404.html頁面,此時瀏覽器地址欄URL沒變化,但是狀態碼不再是404,而是200。
再介紹使用error_page配置項指定錯誤頁面的情況。
error_page配置項存在以下多種重定向方式,Nginx做了不同的處理,實際訪問到頁面也存在一定的差異,而瀏覽器的地址欄的表現也存在不同。
下面分別討論在各種不同重定向方式下,訪問同一個URL,而這個URL對應的原始頁面不存在的情況下,Nginx的處理方式以及瀏覽器的表現。
試驗過程中,瀏覽器中輸入的原始URL都是:http://ng.coe2coe.me:8000/abc/2.txt
這個URL對應的頁面並不存在,默認會按照Nginx內置處理方式,產生HTTP 404狀態碼的響應。
在以下討論中,都使用了error_page配置項,但是各自的配置方式稍有不同,因而產生了不同的結果。
(1)重定向到內部頁面。
配置內容:
location /abc {
root html;
error_page 404 /404.html;
}
運行結果:
將內容為http://ng.coe2coe.me:8000/404.html的內容,狀態碼為404,地址欄URL沒有變化。
(2)重定向到外部頁面
將跳轉到指定的外部服務器的頁面。
配置內容:
location /abc {
root html;
error_page 404 http://ng.coe2coe.me:8000/404.html;
}
運行結果:
瀏覽器地址欄的URL已經變化為error_page指定的URL,,HTTP狀態碼為200。
從下圖可以看到變化后的URL為:http://ng.coe2coe.me:8000/404.html。
在僅僅將error_page指向的頁面從服務器內部頁面變化為外部服務器的頁面后,HTTP狀態碼就變化了。
(3)修改HTTP狀態碼。
配置內容:
location /abc {
root html;
error_page 404 = /404.html;
}
運行結果:
由於使用了error_page 404 = /404.html這種方式,在第(1)種情況的基礎上,加了等於號,處理結果也發生了變化。此時Nginx根據/404.html頁面的訪問結果來決定HTTP 狀態碼。由於這里/404.html頁面是存在的,狀態碼是200。
(4)使用內部重定向。
在nginx的配置文件中,使用@標記來表達內部跳轉指令,這種指令也可以用於error_page的配置中。
配置內容:
location /abc {
root html;
error_page 404 @notfound;
}
location @notfound {
proxy_pass http://tomcat101a.coe2coe.me:8080;
}
運行結果:
在這種情況下,瀏覽器的地址欄URL沒有變化,HTTP狀態碼404也沒有變化,顯示的內容是http://tomcat101a.coe2coe.me:8080/abc/2.txt的內容。
總結:
(1)關於頁面刷新與瀏覽器緩存:
上述試驗過程中,狀態碼為200的情況時,每次使用瀏覽器發送請求之前都沒有使用瀏覽器緩存。如果使用瀏覽器緩存,有些情況下狀態碼為304。Chrome瀏覽器不使用瀏覽器緩存的方法有兩種:
(a)使用瀏覽器清空歷史記錄的方式來清空緩存
(b)使用Ctrl+F5來刷新頁面,而不是使用F5。
(2)Nginx支持的另外一種指定錯誤頁面的方式,即使用try_files。
(3)在各種情況下,Nginx處理方式稍有不同,瀏覽器上看到的頁面結果也有所不同。
原文鏈接:http://www.bubuko.com/infodetail-2133221.html