Nginx error_page自定義錯誤頁面設(shè)置過程
目錄
- Nginx error_page自定義錯誤頁面設(shè)置
- Nginx error_page 使用
- 1. error_page語法
- 2. 實例
- 3. Nginx 自定義404錯誤頁面配置中有無等號的區(qū)別
- 總結(jié)
Nginx error_page自定義錯誤頁面設(shè)置
#fastcgi_intercept_errors on; #語法:fastcgi_intercept_errors on|off #默認值:fastcgi_intercept_errors off #使用字段:http, server, location #這個指令指定是否傳遞4xx和5xx錯誤信息到客戶端,或者允許nginx使用error_page處理錯誤信息。 #你必須明確的在error_page中指定處理方法使這個參數(shù)有效,正如Igor所說“如果沒有適當?shù)奶幚矸椒ǎ? #nginx不會攔截一個錯誤,這個錯誤不會顯示自己的默認頁面,這里允許通過某些方法攔截錯誤。 #proxy_intercept_errors 為on 表示 nginx按照原response #proxy_intercept_errors on|off #proxy_intercept_errors off #使用字段:http, server, location #code輸出,后端是404,就是404.這個變量開啟后,我們才能自定義錯誤頁面。 proxy_intercept_errors on; upstream dev1 { server 127.0.0.1:8080; #HessianTest3 } server { listen 80; server_name kevin.com; location / { proxy_pass http://dev1; #HessianTest3 } #參考書本第40頁 #error_page 404 =200 /404.html; #error_page 500 502 503 504 =200 /50x.html; #location = /404.html { # root html; # #} #location = /50x.html { # root html; #} #當頁面發(fā)生異常的時候可以指定跳轉(zhuǎn)到location中,也可以指定跳轉(zhuǎn)到指定的URL地址上面 error_page 404 http://www.baidu.com/; }
Nginx error_page 使用
接觸到了error_page ,這里記錄一下
1. error_page語法
語法:
error_page code [ code... ] [ = | =answer-code ] uri | @named_location
默認值:
no?
使用字段:
http, server, location, location 中的if字段
2. 實例
nginx指令error_page的作用是當發(fā)生錯誤的時候能夠顯示一個預(yù)定義的uri,比如:
error_page 502 503 /50x.html; location = /50x.html { ? ? root /usr/share/nginx/html; } ?
這樣實際上產(chǎn)生了一個內(nèi)部跳轉(zhuǎn)(internal redirect),當訪問出現(xiàn)502、503的時候就能返回50x.html中的內(nèi)容,這里需要注意是否可以找到50x.html頁面,所以加了個location保證找到你自定義的50x頁面。
同時我們也可以自己定義這種情況下的返回狀態(tài)嗎,比如:
error_page 502 503 =200 /50x.html; location = /50x.html { ? ? root /usr/share/nginx/html; } ??
這樣用戶訪問產(chǎn)生502 、503的時候給用戶的返回狀態(tài)是200,內(nèi)容是50x.html。
當error_page后面跟的不是一個靜態(tài)的內(nèi)容的話,比如是由proxyed server或者FastCGI/uwsgi/SCGI server處理的話,server返回的狀態(tài)(200, 302, 401 或者 404)也能返回給用戶。
error_page 404 = /404.php; location ~ \.php$ { ? ? fastcgi_pass 127.0.0.1:9000; ? ? fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; ? ? include fastcgi_params; } ??
也可以設(shè)置一個named location,然后在里邊做對應(yīng)的處理。
error_page 500 502 503 504 @jump_to_error; location @jump_to_error { ? ? ? ? proxy_pass http://backend; }
同時也能夠通過使客戶端進行302、301等重定向的方式處理錯誤頁面,默認狀態(tài)碼為302。
error_page 403 ? ? ?http://example.com/forbidden.html; error_page 404 =301 http://example.com/notfound.html;
同時error_page在一次請求中只能響應(yīng)一次,對應(yīng)的nginx有另外一個配置可以控制這個選項:recursive_error_pages
默認為false,作用是控制error_page能否在一次請求中觸發(fā)多次。
3. Nginx 自定義404錯誤頁面配置中有無等號的區(qū)別
- error_page 404 /404.html 可顯示自定義404頁面內(nèi)容,正常返回404狀態(tài)碼。
- error_page 404 = /404.html 可顯示自定義404頁面內(nèi)容,但返回200狀態(tài)碼。
- error_page 404 /404.php 如果是動態(tài)404錯誤頁面,包含 header 代碼(例如301跳轉(zhuǎn)),將無法正常執(zhí)行。正常返回404代碼。
- error_page 404 = /404.php 如果是動態(tài)404錯誤頁面,包含 header 代碼(例如301跳轉(zhuǎn)),加等號配置可以正常執(zhí)行,返回php中定義的狀態(tài)碼。但如果php中定義返回404狀態(tài)碼,404狀態(tài)碼可以正常返回,但無法顯示自定義頁面內(nèi)容(出現(xiàn)系統(tǒng)默認404頁面),這種情況可以考慮用410代碼替代( header("HTTP/1.1 410 Gone"); 正常返回410狀態(tài)碼,且可正常顯示自定義內(nèi)容)。
例子
server ?{ ? ? listen 80; ? ? server_name ?test.com; ? ? index ? ? ? index.html index.htm; ? ? ? location / {? ? ? ? ? proxy_pass http://online; ? ? ? ? error_page 404 = @fallback; ? ? ? ? proxy_intercept_errors on; ? ? } ? ? location @fallback { ? ? ? ? proxy_pass http://backend; ? ? } } ? upstream online { ? ? ? ? ?server 192.168.88.18:80; ? ? ? ? ?server 192.168.88.28:80; } ? upstream backend { ? ? ? ? ?server 192.168.88.38:80; }
例子
由于在nginx配置中,設(shè)置了limit_req的流量限制,導(dǎo)致許多請求返回503錯誤代碼,在限流的條件下,為提高用戶體驗,希望返回正常Code 200,且返回操作頻繁的信息:
location ?/test { ? ...? ? limit_req zone=zone_ip_rm burst=1 nodelay;? ? error_page 503 =200 /dealwith_503?callback=$arg_callback; } location /dealwith_503{? ? set $ret_body "{"code": "V00006","msg": "操作太頻繁了,請坐下來喝杯茶。"}"; ? ?if ( $arg_callback != "" )? ? ?{? ? ? ? ?return 200 "try{$arg_callback($ret_body)}catch(e){}";? ? ?}? ? ?return 200 $ret_body;? }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持。
