HTTP Status 404 的詳細解決思路

維基百科:

HTTP 404或Not Found錯誤消息是HTTP的其中一種「標準迴應消息」(HTTP狀態碼),此消息表明客戶端在瀏覽網頁時,服務器沒法正常提供消息,或是服務器沒法迴應且不知緣由。一般是由於用戶所訪問的對應網頁已被刪除被移動或從未存在。404也是互聯網上最多見的錯誤之一。404錯誤消息可能與「server not found」(沒法找到服務器)或其餘相似消息產生混淆。javascript

簡單說,就是服務器中所請求的資源不存在,或者存在的狀況下,咱們發送的請求經過URL(統一資源定位符)在服務器沒有找到所需資源。css

什麼是URL

出現404最多見的的是路徑錯誤。讓咱們先了解下URL。 URL,(Uniform Resource Locator)統一資源定位符,又叫統一資源定位器、定位地址、URL地址,俗稱網頁地址或簡稱網址。正如其名,就是用於定位服務的資源在哪?發送的Request去哪裏找,而後服務器再作出相應的邏輯響應(Response)。html

統一資源定位符的標準格式以下:java

[協議類型]://[服務器地址]:[端口號]/[資源層級UNIX文件路徑][文件名]?[查詢]#[片斷ID]
複製代碼

統一資源定位符的完整格式以下:nginx

[協議類型]://[訪問資源須要的憑證信息]@[服務器地址]:[端口號]/[資源層級UNIX文件路徑][文件名]?[查詢]#[片斷ID]
複製代碼

舉個栗子:git

http://127.0.0.1:8080/f?kw=%BA%A3%D4%F4%CD%F5&fr=ala0&tpl=5
複製代碼

http,是協議;127.0.0.1,是個人服務器地址; 8080,是服務器上的端口號; /f,是路徑;其中/ 分隔目錄和子目錄。 ?kw=%BA%A3%D4%F4%CD%F5&fr=ala0&tpl=5,是查詢。? 分隔實際的URL和參數,這裏很容易出錯。雖然數據(除了數字)都會轉換成以UTF8的URL編碼,& 用於參數間的分隔符,= 等於(不是賦值),初次以外,還有+表示空格,#表示書籤。github

格式須要注意的地方: 1)通常使用Tomcat和nginx等服務器啓動的項目,須要查看端口是否正確。 2)協議名http/https,域名或者ip地址是否有誤? 3)/分割符,以 / 區別路徑中的每個目錄名稱。這樣咱們咱們能夠根據URL一層層的去查找咱們項目的目錄,分析出現404可能的緣由是否爲路徑錯誤或者資源不存在。 3)&表示的參數,能夠預估其值是否達到預期。web

一次完整Http請求

瞭解咱們請求的過程有助於咱們理解web的大致運行流程。 整體流程以下: 域名解析 --> 發起TCP的3次握手 --> 創建TCP鏈接後發起http請求 --> 服務器響應http請求,瀏覽器獲得html代碼 --> 瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶。 下面咱們詳細講解下它們都幹了些什麼?面試

1)DNS域名解析

dns是什麼?將主機域名轉換爲ip地址,屬於應用層協議,使用UDP傳輸。 dns工做原理: 1、主機向本地域名服務器的查詢通常都是採用遞歸查詢。
2、本地域名服務器向根域名服務器的查詢的迭代查詢。瀏覽器

  1. 當用戶輸入域名時,瀏覽器先檢查本身的緩存中是否 這個域名映射的ip地址,有解析結束。
    2)若沒命中,則檢查操做系統緩存(如Windows的hosts)中有沒有解析過的結果,有解析結束。
    3)若無命中,則請求本地域名服務器解析( LDNS)。
    4)若LDNS沒有命中就直接跳到根域名服務器請求解析。根域名服務器返回給LDNS一個 主域名服務器地址。
    5) 此時LDNS再發送請求給上一步返回的gTLD(通用頂級域),接受請求的gTLD查找並返回這個域名對應的Name Server的地址
    6) Name Server根據映射關係表找到目標ip,返回給LDNS
    7) LDNS緩存這個域名和對應的ip,把解析的結果返回給用戶,用戶根據TTL值緩存到本地系統緩存中,域名解析過程至此結束。

2)發起TCP的3次握手,創建TCP鏈接

tcp爲何要三次握手?謝希仁的《計算機網絡》給出的解釋是爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤。三次握手過程: 第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

完成三次握手,客戶端與服務器開始傳送數據。

有人說會不會由於丟包而致使404錯誤?可能性極小,來看看偉大的前人給TCP的付出,這裏不得不提 TCP是如何保證可靠傳輸的,與上面三次握手協議都是校招面試的重點。

1.三次握手。
2.將數據截斷爲合理的長度。應用數據被分割成 TCP 認爲最適合發送的數據塊(按字節編號,合理分片)
3.超時重發。當 TCP 發出一個段後,它啓動一個定時器,若是不能及時收到一個確認就重發
4.確認應答:對於收到的請求,給出確認響應
5.校驗和:校驗出包有錯,丟棄報文段,不給出響應
6.序列號:對失序數據進行從新排序,而後才交給應用層
7.丟棄重複數據:對於重複數據 , 可以丟棄重複數據
8.流量控制。TCP 鏈接的每一方都有固定大小的緩衝空間。TCP 的接收端只容許另外一端發送接收端緩衝區所能接納的數據。這將防止較快主機導致較慢主機的緩衝區溢出。
9.擁塞控制。當網絡擁塞時,減小數據的發送。

3) 創建TCP鏈接後發起http請求

http是一個無狀態的請求/響應協議,可是這不能知足如今的業務,因此有了cookie和session,它們都是用於保存狀態的。

一個完整的HTTP請求報文包括請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成。如圖所示:

咱們也能夠打開谷歌-->F12進入到調試模式-->Network-->查看信息。裏面包含不少請求信息或者響應信息,咱們也能夠基於它們進行開發操做。

再讓咱們瞭解HTTP請求的常見方法:GET,POST,DELETE,TRACE ,CONNECT 。

方法名 用意
POST 請求處理數據,通常用於修改,新增資源
GET 只用在讀取數據,不作修改,返回指定的頁面
DELETE 刪除所指定的資源
TRACE 主要用於測試或診斷,不經常使用
CONNECT 一般用於SSL加密服務器的連接,用於給可以將鏈接改成管道方式的代理服務器。

注:這裏提一下cookie和session的區別(面試常考):

1,存儲的位置不一樣。cookie:存放在客戶端,session:存放在服務端。Session存儲的數據比較安全

2,存儲的數據類型不一樣。二者都是key-value的結構,但針對value的類型是有差別的

cookie:value只能是字符串類型,session:value是Object類型

3,存儲的數據大小限制不一樣。cookie:大小受瀏覽器的限制,不少是是4K的大小, session:理論上受當前內存的限制,

4,生命週期的控制。cookie的生命週期當瀏覽器關閉的時候,就消亡了

(1)cookie的生命週期是累計的,從建立時,就開始計時,30分鐘後,cookie生命週期結束,

(2)session的生命週期是間隔的,從建立時,開始計時如在30分鐘,沒有訪問session,那麼session生命週期被銷燬.

4)服務器響應http請求,瀏覽器獲得html代碼

5)瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等)

html頁面主要由dom、css、javascript等部分構成,還可能引入img、iframe等其餘資源。瀏覽器接收到html代碼,多是一份完整的文檔,也多是一個chunk,即開始解析。解析過程是先構建dom樹,再根據dom樹構建渲染樹,最後瀏覽器將渲染樹繪製到頁面上。

6)瀏覽器對頁面進行渲染呈現給用戶

什麼是渲染?渲染 在電腦繪圖中是指用軟件從模型生成圖像的過程,也就是將咱們Html的邏輯轉換成咱們肉眼可見的對象。具體課看博客:sylvanassun.github.io/2017/10/03/…

出現404的一些解決辦法

1)目錄不能被引用。 排錯方法:

在 Eclipse的「包資源管理器(Package Explorer)」檢查文件存放的位置。因爲META-INF

WEB-INF文件夾下的內容沒法對外發布,因此,若是你引用了帶這兩個目錄的文件,確定是不容許。例如: http://localhost:8080/guestbook/WEB-INF/index.html就是錯誤的

文件位置存放錯誤

2)URL輸入錯誤。排錯方法:

首先,查看URL的IP地址和端口號是否書寫正確。

其次,查看上下文路徑是否正確 Project--------Properties------MyElipse-----Web-----

Web Context-root檢查這個路徑名稱是否書寫正確。

最後,檢查一下文件名稱是否書寫正確。 3)未部署Web應用

4)Tomcat服務器中web.xml中的問題。 排錯方法:

若是你的web應用程序有多個jsp頁面的話,當你點擊你web應用程序的虛擬根目錄時可能會出現404錯 誤,只是你只須要修改Tomcat服務器中web.xml

 <init-param>
 
        <param-name>listings</param-name>
 
        <param-value>false(將其該爲true)</param-value>
 
  </init-param>
複製代碼

補充說明:在6.0.18 版本error:「 The requested resource () is not available. 」

老是沒法訪問/myapp/*.jsp文件,能夠將 /ROOT 中build.xml 文件copy 一份到myapp,  注意把裏面全部的 ROOT 用 myapp 代替. 應該就OK.

5)WEB-INF下面必需要有幾個固定的文件夾和文件

 ±web.xml 該web app的配置文件
 
 ±lib 該web app用到的庫文件
 
 ±classes存放編譯好的servlet 
複製代碼

請注意他們的名字,我曾經就因爲把classes寫成class,查錯查了半宿還沒解決,因此寫這些的時候千萬要仔細,要不會浪費更多的精力去查錯。

六、若是要運行的不是.jsp文件,而是servlet(.class)文件,要配置web.xml(固然是WEB-INF下面的),加上如下字段:

 <servlet>
 
      <servlet-name>HelloWorldServlet</servlet-name>
 
      <servlet-class>HelloWorldServlet</servlet-class>
 
 </servlet>
 
 <servlet-mapping>
 
      <servlet-name>HelloWorldServlet</servlet-name>
    
      <url-pattern>/HelloWorldServlet</url-pattern>
 
 </servlet-mapping>
複製代碼

其中的「HelloWorldServlet」改成你要運行的文件名

7)struts.xml配置錯誤,多是你的Action值寫錯或者連接URL寫錯

下面是我本身的解決辦法,不少書都是導入六個文件,我本身的話是多增長了commons-lang3-3.1.jar和javassist-3.11.GA.jar

增長commons-lang3-3.1.jar文件到啊WEB-INF/lib目錄下,struts2最新的web開發包以下:

下載地址:download.csdn.net/detail/ahy1…

解決用例往後遇到持續更新ing....

相關文章
相關標籤/搜索