HTTP Status 404 的詳細解決思路

發表於2019-04-27

維基百科:

HTTP 404或Not Found錯誤訊息是HTTP的其中一種“標準迴應訊息”(HTTP狀態碼),此訊息代表客戶端在瀏覽網頁時,伺服器無法正常提供訊息,或是伺服器無法迴應且不知原因。通常是因為使用者所訪問的對應網頁已被刪除被移動或從未存在。404也是網際網路上最常見的錯誤之一。404錯誤訊息可能與“server not found”(無法找到伺服器)或其他類似訊息產生混淆。

簡單說,就是伺服器中所請求的資源不存在,或者存在的情況下,我們傳送的請求通過URL(統一資源定位符)在伺服器沒有找到所需資源。

什麼是URL

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

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

[協議型別]://[伺服器地址]:[埠號]/[資源層級UNIX檔案路徑][檔名]?[查詢]#[片段ID]
複製程式碼

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

[協議型別]://[訪問資源需要的憑證資訊]@[伺服器地址]:[埠號]/[資源層級UNIX檔案路徑][檔名]?[查詢]#[片段ID]
複製程式碼

舉個栗子:http://127.0.0.1:8080/f?kw=������&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編碼,& 用於引數間的分隔符,= 等於(不是賦值),初次之外,還有+表示空格,#表示書籤。

格式需要注意的地方: 1)一般使用Tomcat和nginx等伺服器啟動的專案,需要檢視埠是否正確。 2)協議名http/https,域名或者ip地址是否有誤? 3)/分割符,以 / 區別路徑中的每一個目錄名稱。這樣我們我們可以根據URL一層層的去查詢我們專案的目錄,分析出現404可能的原因是否為路徑錯誤或者資源不存在。 3)&表示的引數,可以預估其值是否達到預期。

一次完整Http請求

瞭解我們請求的過程有助於我們理解web的大體執行流程。 總體流程如下: 域名解析 --> 發起TCP的3次握手 --> 建立TCP連線後發起http請求 --> 伺服器響應http請求,瀏覽器得到html程式碼 --> 瀏覽器解析html程式碼,並請求html程式碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給使用者。 下面我們詳細講解下它們都幹了些什麼?

1)DNS域名解析

dns是什麼?將主機域名轉換為ip地址,屬於應用層協議,使用UDP傳輸。 dns工作原理: 一、主機向本地域名伺服器的查詢一般都是採用遞迴查詢。
二、本地域名伺服器向根域名伺服器的查詢的迭代查詢。

  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值快取到本地系統快取中,域名解析過程至此結束。

HTTP Status 404 的詳細解決思路

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狀態,完成三次握手。

完成三次握手,客戶端與伺服器開始傳送資料。

HTTP Status 404 的詳細解決思路
有人說會不會因為丟包而導致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)、空行和請求資料四個部分組成。如圖所示:

HTTP Status 404 的詳細解決思路
我們也可以開啟谷歌-->F12進入到除錯模式-->Network-->檢視資訊。裡面包含很多請求資訊或者響應資訊,我們也可以基於它們進行開發操作。

HTTP Status 404 的詳細解決思路
再讓我們瞭解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,查錯查了半宿還沒解決,所以寫這些的時候千萬要仔細,要不會浪費更多的精力去查錯。

6、如果要執行的不是.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....

相關文章