HTTP Status 404 的解决思路

bug 同时被 2 个专栏收录
25 篇文章 1 订阅
3 篇文章 1 订阅

目录

维基百科:

什么是URL

一次完整Http请求

1)DNS域名解析 

2)发起TCP的3次握手,建立TCP连接

3) 建立TCP连接后发起http请求

4)服务器响应http请求,浏览器得到html代码

5)浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)

6)浏览器对页面进行渲染呈现给用户

出现404的一些解决办法

持续更ing....


维基百科:

HTTP 404Not 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=%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编码,& 用于参数间的分隔符,= 等于(不是赋值),初次之外,还有+表示空格,#表示书签。

格式需要注意的地方:

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值缓存到本地系统缓存中,域名解析过程至此结束

 

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 。

GET只用在读取数据,不做修改,返回指定的页面
POST请求处理数据,一般用于修改,新增资源
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页面主要由domcssjavascript等部分构成,还可能引入imgiframe等其他资源。浏览器接收到html代码,可能是一份完整的文档,也可能是一个chunk,即开始解析。解析过程是先构建dom树,再根据dom树构建渲染树,最后浏览器将渲染树绘制到页面上。

6)浏览器对页面进行渲染呈现给用户

什么是渲染?渲染 在电脑绘图中是指用软件从模型生成图像的过程,也就是将我们Html的逻辑转换成我们肉眼可见的对象。具体课看博客:https://sylvanassun.github.io/2017/10/03/2017-10-03-BrowserCriticalRenderingPath/


出现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开发包如下:

 

下载地址:http://download.csdn.net/detail/ahy1024/4626028

8)是否同一个应用启动了多个java应用服务,有时后台并没有关闭之前的服务,你又重新启动,,可能会报错404

 

持续更ing....

 

评论 5 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:程序猿惹谁了 设计师:我叫白小胖 返回首页

打赏作者

_睶_

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值