nginx 、apache、tomcat自定義返回錯誤頁面配置

目的:解決客戶端訪問公司域名站點出現報錯時返回生硬報錯代碼問題,進行返回錯誤頁面自定製,提供良好用戶體驗。

本文將依託nginx,從幾個角度講述幾個web(nginx、apache、tomcat)服務,如何進行錯誤頁面自定義。


首先梳理一下web服務器常見的錯誤類型:

④4xx 錯誤 

400 Bad Request 請求出現語法錯誤。 


401 Unauthorized 客戶試圖未經授權訪問受密碼保護的頁面。應答中會包含一個WWW-Authenticate頭,瀏覽器據此顯示用戶名字/密碼對話框,然後在填寫合適的Authorization頭後再次發出請求。 

403 Forbidden 資源不可用。服務器理解客戶的請求,但拒絕處理它。通常由於服務器上文件或目錄的權限設置導致。 


404 Not Found 無法找到指定位置的資源。這也是一個常用的應答。 

405 Method Not Allowed 請求方法(GET、POST、HEAD、Delete、PUT、TRACE等)對指定的資源不適用。(HTTP 1.1新) 

406 Not Acceptable 指定的資源已經找到,但它的MIME類型和客戶在Accpet頭中所指定的不兼容(HTTP 1.1新)。 

407 Proxy Authentication Required 類似於401,表示客戶必須先經過代理服務器的授權。(HTTP 1.1新) 

408 Request Timeout 在服務器許可的等待時間內,客戶一直沒有發出任何請求。客戶可以在以後重複同一請求。(HTTP 1.1新) 

409 Conflict 通常和PUT請求有關。由於請求和資源的當前狀態相沖突,因此請求不能成功。(HTTP 1.1新) 

410 Gone 所請求的文檔已經不再可用,而且服務器不知道應該重定向到哪一個地址。它和404的不同在於,返回407表示文檔永久地離開了指定的位置,而404表示由於未知的原因文檔不可用。(HTTP 1.1新) 

411 Length Required 服務器不能處理請求,除非客戶發送一個Content-Length頭。(HTTP 1.1新) 

412 Precondition Failed 請求頭中指定的一些前提條件失敗(HTTP 1.1新)。 

413 Request Entity Too Large 目標文檔的大小超過服務器當前願意處理的大小。如果服務器認爲自己能夠稍後再處理該請求,則應該提供一個Retry-After頭(HTTP 1.1新)。 

414 Request URI Too Long URI太長(HTTP 1.1新)。 

416 Requested Range Not Satisfiable 服務器不能滿足客戶在請求中指定的Range頭。(HTTP 1.1新) 

⑤5xx 服務器錯誤 

500 Internal Server Error 服務器遇到了意料不到的情況,不能完成客戶的請求。 

501 Not Implemented 服務器不支持實現請求所需要的功能。例如,客戶發出了一個服務器不支持的PUT請求。 

502 Bad Gateway 服務器作爲網關或者代理時,爲了完成請求訪問下一個服務器源碼天空,但該服務器返回了非法的應答。 

503 Service Unavailable 服務器由於維護或者負載過重未能應答。例如,Servlet可能在數據庫連接池已滿的情況下返回503。服務器返回503時可以提供一個Retry-After頭。 

504 Gateway Timeout 由作爲代理或網關的服務器使用,表示不能及時地從遠程服務器獲得應答。(HTTP 1.1新) 

505 HTTP Version Not Supported 服務器不支持請求中所指明的HTTP版本。(HTTP 1.1新)

http://www.codesky.net/article/201012/149212.html


配置實例:


1.nginx作爲域名服務器,提供靜態、動態域名服務,定製錯誤頁面返回配置方法;


在域名監聽主目錄下建立error頁面文件夾,將錯誤頁面文件上傳到文件夾,nginx配置如下:


#www.xx.jp##靜態頁面!

server {

       listen       80;

       server_name  www.xx.com;

       location /      {

       root   /home/wwwroot/www.xx.com/;

       index  index.html index.htm;

# redirecet server error pages to the static pag !

       error_page  401         =       /error/401.html;

       error_page  403         =       /error/403.html;

       error_page  404         =       /error/404.html;

       error_page  500         =       /error/500.html;

       error_page  502 503 504 =      /error/503.html;

                  }

       }


#www.xx.jp##動態頁面!

  server {

       listen       80;

       server_name  www.xx.com;

       location / {

       root   /home/wwwroot/www.xx.com/;

       index index.php index.html index.htm;

# redirecet server error pages to the static pag !

# redirecet server error pages to the static pag /50x.html

error_page  400                /error/400.html;

error_page  401                /error/401.html;

       error_page  403                /error/403.html;

       error_page  404               /error/404.html;

       error_page  408               /error/408.html;

       error_page  500                /error/500.html;

       error_page  502 503 504        /error/502.html;

       location ~ .*\.(php|php5)?$

                       {

                               try_files $uri =404;

                               fastcgi_pass  unix:/tmp/php-cgi.sock;

                               fastcgi_index index.php;

                               include fcgi.conf;

                       }

                   }

       } 


2.nginx作爲反向代理服務器,定製錯誤頁面返回配置方法;

經簡單測試,nginx反響代理只能攔截502錯誤代碼!可以將錯誤頁面直接跳轉到公司其它服務器的錯誤頁面,配置方法;


       server

       {

               listen  80;

               server_name     www.aa.com;

               location / {

error_page  502 503 504      http://www.xx.com/503.html;   #將返回500系列的錯誤頁面,直接跳轉的www.xx.com的503錯誤頁面(此頁面要真實存在)。

#                proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;

               proxy_pass        http://172.17.4.11:6666; 

               proxy_redirect off;

               proxy_set_header   Host             $host;

               proxy_set_header   X-Real-IP        $remote_addr;

               proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

中間省略********************88

                         }

       }

}


#上面的配置方法,頁面會跳轉到http://www.xx.com/503.html ,下面的配置遇到錯誤頁面不會跳轉,在原有域名請求連接頁面展示。


#port 80

    server

     {

           listen  80;

           server_name  tz1.xx.com;

                       proxy_redirect off;

           location / {


#                   proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;

                   proxy_pass        http://192.168.18.72:10080;

                   proxy_set_header   Host             $host;

                   proxy_set_header   X-Real-IP        $remote_addr;

                   proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

中間省略********************88

# redirecet server error pages to the static pag !

error_page  408                /error/408.

                   error_page  500             /error/500.html;

error_page  502 503 504     /error/503.html;

                        }

#新建一個location 指定一下監聽目錄(/data/nperror),在監聽目錄內建立 error文件夾,將錯誤頁面上傳的error文件夾內。

       location /error {

              root /data/nperror;

}


         }


3.nginx作爲反向代理服務器,apache作爲後端服務器,apache自定義錯誤頁面配置如下:

apache默認自帶有錯誤返回頁面,默認處於註釋狀態,如果公司沒有特殊要求,只要將註釋關掉即可,下面的配置的例子 874~878行是我自己添加的(將錯誤頁面文件上傳到/var/www/error),返回的頁面是我們公司自己定製頁面,將下面的錯誤代碼行進行註釋。其它的錯誤頁面保持默認。



874 ErrorDocument 401 /error/401.html

875 ErrorDocument 403 /error/403.html

876 ErrorDocument 404 /error/404.html

877 ErrorDocument 500 /error/500.html

878 ErrorDocument 503 /error/503.html

879 

880     ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var

881 #    ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var

882 #    ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var

883 #    ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var

884     ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var

885     ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var

886     ErrorDocument 410 /error/HTTP_GONE.html.var

887     ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var

888     ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var

889     ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var

890     ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var

891     ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var

892 #    ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var

893     ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var

894     ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var

895 #    ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var

896     ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var



4.nginx作爲反向代理服務器,tomcat作爲後端服務器,tomcat自定義錯誤頁面配置如下:

將錯誤頁面上傳到域名監聽目錄,tomcat的默認應用放在\webapps\ROOT目錄裏:修改webapps\ROOT\WEB-INF\web.xml


<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

  version="2.5">

 <display-name>Welcome to Tomcat</display-name>

 <description>

    Welcome to Tomcat

 </description>

 <!--配置以下代碼-->

 <error-page>

    <error-code>404</error-code>

    <location>/錯誤頁面的存放路徑/錯誤頁面名稱.jsp</location>

</error-page>

</web-app>


多個錯誤頁面依次往下寫就行了!

<error-page>

<error-code>400</error-code>

<location>/400.html</location>

</error-page>

<error-page>

<error-code>404</error-code>

<location>/404.html</location>

</error-page>

<error-page>

<error-code>500</error-code>

<location>/error.jsp</location>

</error-page>

本文出自 “康建華” 博客,請務必保留此出處http://michaelkang.blog.51cto.com/1553154/1251192

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章