首頁 > 軟體

Nginx error_page自定義錯誤頁面設定過程

2022-12-29 14:03:05

Nginx error_page自定義錯誤頁面設定

#fastcgi_intercept_errors on;
    #語法:fastcgi_intercept_errors on|off 
    #預設值:fastcgi_intercept_errors off 
    #使用欄位:http, server, location 
    #這個指令指定是否傳遞4xx和5xx錯誤資訊到使用者端,或者允許nginx使用error_page處理錯誤資訊。
    #你必須明確的在error_page中指定處理方法使這個引數有效,正如Igor所說「如果沒有適當的處理方法,
    #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;
        #}

        #當頁面發生異常的時候可以指定跳轉到location中,也可以指定跳轉到指定的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的作用是當發生錯誤的時候能夠顯示一個預定義的uri,比如:

error_page 502 503 /50x.html;
location = /50x.html {
    root /usr/share/nginx/html;
}  

這樣實際上產生了一個內部跳轉(internal redirect),當存取出現502、503的時候就能返回50x.html中的內容,這裡需要注意是否可以找到50x.html頁面,所以加了個location保證找到你自定義的50x頁面。

同時我們也可以自己定義這種情況下的返回狀態嗎,比如:

error_page 502 503 =200 /50x.html;
location = /50x.html {
    root /usr/share/nginx/html;
}   

這樣使用者存取產生502 、503的時候給使用者的返回狀態是200,內容是50x.html。

當error_page後面跟的不是一個靜態的內容的話,比如是由proxyed server或者FastCGI/uwsgi/SCGI server處理的話,server返回的狀態(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;
}   

也可以設定一個named location,然後在裡邊做對應的處理。

error_page 500 502 503 504 @jump_to_error;
location @jump_to_error {    
    proxy_pass http://backend;
}

同時也能夠通過使使用者端進行302、301等重定向的方式處理錯誤頁面,預設狀態碼為302。

error_page 403      http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;

同時error_page在一次請求中只能響應一次,對應的nginx有另外一個設定可以控制這個選項:recursive_error_pages

預設為false,作用是控制error_page能否在一次請求中觸發多次。

3. Nginx 自定義404錯誤頁面設定中有無等號的區別

  • error_page 404 /404.html 可顯示自定義404頁面內容,正常返回404狀態碼。
  • error_page 404 = /404.html 可顯示自定義404頁面內容,但返回200狀態碼。
  • error_page 404 /404.php 如果是動態404錯誤頁面,包含 header 程式碼(例如301跳轉),將無法正常執行。正常返回404程式碼。
  • error_page 404 = /404.php 如果是動態404錯誤頁面,包含 header 程式碼(例如301跳轉),加等號設定可以正常執行,返回php中定義的狀態碼。但如果php中定義返回404狀態碼,404狀態碼可以正常返回,但無法顯示自定義頁面內容(出現系統預設404頁面),這種情況可以考慮用410程式碼替代( header("HTTP/1.1 410 Gone"); 正常返回410狀態碼,且可正常顯示自定義內容)。

例子

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設定中,設定了limit_req的流量限制,導致許多請求返回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; 
}

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com