首頁  >  文章  >  web前端  >  為什麼請求總是404?

為什麼請求總是404?

伊谢尔伦
伊谢尔伦原創
2016-11-21 13:45:522510瀏覽

 這次我們來談談關於404的一些內容。因為在公眾號後台,和QQ群組裡,都有人在問一類的問題:

  我應用已經部署好了,後台啟動也沒見到異常輸出。請求Tomcat的manager這些都可以,為什麼請求自己的應用總是返回404?

  是啊,這是為什麼呢?

  我們來分析這個問題的描述。

  1. 應用部署好了,後台沒有異常輸出。

  2. Tomcat的manager應用可以正常請求

  以上兩點只能說明Tomcat正常啟動,同時manager應用和用戶的應用成功部署,但對於manager的請求正常,並不能保證你自己的應用也能正常請求。

  畢竟,你的應用內資源是什麼,和manager沒有關聯,甚至,你請求的時候,地址還可能寫錯。或者說,你眼睜睜看著應用程式部署在webapps目錄下,但在瀏覽器裡請求總是不停止的返回404。

  上面這個問題是我們這次文章的主要分析的內容。我們先來看,404這個HTTP請求的狀態碼,wikipedia裡這樣描述:

  404(Not Found)這個HTTP錯誤訊息,是個標準的回應碼,在電腦網路通訊中,標識client可以和server通信, 但server找不到client要求的資源。

  在Tomcat裡,404會在許多情況下返回。

  我們前面的文章了說過,Tomcat裡包含兩個預設的Servlet:

  JspServlet, DefaultServlet。 (Tomcat是如何回應靜態資源的?)

  我們隨便請求Tomcat中一個不存在的資源時,例如下面兩個都不存在的資源:

  http://localhost:8080/abc 和http:// localhost:8080/abcd.jsp

  這時候,會請求到上面提到的這兩個Servlet中。此時,由於資源並不存在,所以回傳404和我們預期的一致。

為什麼請求總是404?
例如DefaultServlet,在處理請求時,會在Resource中尋找目前請求的資源是否存在。

這裡用到了一個cache,記錄了目前應用的所有資源內容,

在資源中找不到。下圖是Tomcat根應用程式內的資源
為什麼請求總是404?

這裡的response設定完status和message後,整個處理流程結束,錯誤頁面的展示,是根據具體的配置,不同的狀態碼對應可以對應到不同的頁面,這裡Tomcat的錯誤頁面,我們前面文章分析過具體實作。 (你的錯誤頁。不,是你的錯誤頁)

  我們再來分析看另一種情況:

  比如你在請求manager應用時,應用名稱寫成了Manager或者manageR,這個時候,上面處理其實一致,這個應用程式名稱,會被辨識為/這個應用的一個資源去處理,所以沒有該資源自然是回傳404。
  manager應用下是有404.jsp這個錯誤頁面的,但你直接以下面的形式去請求,還是會得到404

  /man -INF/jsp/404.jsp




這個大家都知道,是Tomcat內對於目錄的存取進行了限制。 (WEB-INF目錄知多少)

再看一種:

你應用內的某個頁面,假設是index.jsp內,其本質上要跳到其它的一個頁面,如果是使用sendRedirect還好,跳轉後顯示具體的路徑資訊。但假設使用的forward,這個時候,你forward的頁面又不存在


這個時候每次請求都會是404,但你看著你請求的頁面明明安靜的躺在目錄裡。

所以,再看到請求返回404的時候,要分情況分析,具體是什麼原因導致的,是真的資源找不到,還是其原因。

甚至還有可能是你配置了多個error code對應到同樣一個404的錯誤頁面,你每次看到404,也有可能是其原因。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn