当我在浏览器地址栏里输入一个网址后所发生的故事

1、识别URL

包括协议、域名、路径、端口,具体构成为:

(1)请求行

(2)请求头

其中包含很多参数,自行构建请求头时,最常用的如下:

参数含义
Accept-Charset浏览器可以接受的字符编码集
Accept-Encoding指定浏览器可以支持的web服务器返回内容压缩编码类型
Accept-Language浏览器可接受的语言
Content-Length请求的内容长度
Content-Length请求的内容长度
Content-Type请求的与实体对应的MIME信息
Connection表示是否需要持久连接。(HTTP 1.1默认进行持久连接)
Host指定请求的服务器的域名和端口号

(3)请求体

最常见的有四种

参数含义
application/json传递普通的json数据
text/xml提交xml格式的文本数据
application/x-www-form-urlencoded浏览器表单提交数据
multipart/form-data提交多文件数据,文件之间通过–boundary分割

2、DNS解析

(1)查看本地hosts文件

先查看本地hosts文件中是否有该域名对应的IP地址,若没有,则询问本地域名服务器。

(2)询问本地域名服务器

本地服务器采用迭代查询。刚开始它先向一个根域名服务器查询。之后就根据返回要查询的域名服务器,进行查询,直到获取对应主机的IP地址。

(3)询问根域名服务器

根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器的IP地址。

(4)询问顶级域名服务器

顶级域名服务器告诉本地服务器,下一次应查询的权限域名服务器的IP地址。

(5)询问权限域名服务器

权限域名服务器告诉本地服务器,所查询的主机的IP地址。

3、网络请求

(1)根据IP地址访问web服务器(三次握手)

建立连接、发送报文、获取服务器返回的报文。当数据传递完后,关闭连接(四次握手)

4、web服务器处理请求

(1)调用后端语言进程来处理 HTTP 请求

调用python、php、node.js等语言,来处理客户端的请求,涉及数据库的操作

(2)返回response

将数据封装好,返回给客户端

5、浏览器处理response

(1)response解析

接收到服务器返回的数据后,进行解析处理

  • HTML/SVG/XHTML,事实上,Webkit有三个C++的类对应这三类文档。解析这三种文件会产生一个DOM Tree。
  • CSS,解析CSS会产生CSS规则树。
  • Javascript,脚本,主要是通过DOM API和CSSOM API来操作DOM Tree和CSS Rule Tree

(2)dom渲染

解析完成后,浏览器引擎会通过DOM Tree 和 CSS Rule Tree 来构造 Rendering Tree。

注意:

  • Rendering Tree 渲染树并不等同于DOM树,因为一些像Header或display:none的东西就没必要放在渲染树中了。
  • CSS 的 Rule Tree主要是为了完成匹配并把CSS Rule附加上Rendering Tree上的每个Element。也就是DOM结点。也就是所谓的Frame。然后,计算每个Frame(也就是每个Element)的位置,这又叫layout和reflow过程。

(3)最后通过调用操作系统Native GUI的API绘制

<think>好的,我现在需要帮助用户分析更换后端端口后出现404错误的原因。根据用户提供的引用和之前的历史回答,我应该从多个方面考虑可能的因素。 首先,用户提到更换端口后所有请求都返回404。这可能涉及到服务是否在正确的端口上运行。根据引用[1],需要检查后端服务器是否正在监听新端口。例如,用户可能修改了端口但没有重启服务,或者服务配置文件中端口设置不正确。这时候应该让用户检查application.properties或类似配置文件,确认端口是否正确,并查看日志是否有错误信息。 其次,引用[2]提到localhost可能导致的问题。如果服务绑定到localhost,那么只能本地访问,而如果用户通过其他IP访问,可能无法连接到后端。因此,用户需要确认服务是否绑定到0.0.0.0,而不仅仅是localhost。这在之前的回答中也提到过,所以需要再次强调这一点。 接下来,路径配置的问题。引用[3]和之前的回答都提到Nginx配置和后端接口路径是否匹配。如果用户使用了反向代理如Nginx,需要确保代理的路径和后端实际接口路径一致。否则,即使端口正确,路径不匹配也会导致404。例如,Nginx可能将请求转发到新端口,但后端服务的API路径发生了变化,导致无法找到资源。 另外,引用[4]提到Tomcat端口冲突的解决方法,虽然用户现在的问题可能不是端口冲突,但需要确认新端口21090是否已被其他进程占用。用户可以使用netstat或类似的工具检查端口占用情况。 服务启动问题也是一个可能因素。用户是否在更换端口后正确重启了服务?有时候配置更改需要重启才能生效,如果没有重启,服务仍然在旧端口上运行,导致新端口无法访问。 最后,考虑是否有防火墙或安全组规则阻止了新端口的访问。特别是如果服务部署在云服务器或虚拟环境中,可能需要调整安全组设置允许21090端口的流量。 总结下来,可能的原因包括:服务未正确监听新端口、绑定地址限制、路径配置不匹配、端口冲突、未重启服务、防火墙限制等。需要逐步排查这些方面,帮助用户定位问题。</think>### 关于访问 `localhost:21090` 出现 404 错误的原因分析 #### 1. **服务未正确监听新端口** - **检查服务启动状态** 确保后端服务已成功启动并绑定到端口 `21090`。可通过以下命令验证: ```bash netstat -ano | findstr ":21090" ``` 若端口未处于 `LISTENING` 状态,则服务可能未启动或配置未生效[^1]。 - **配置文件核对** 检查 `application.properties` 或服务配置文件中的端口设置: ```properties server.port=21090 server.address=0.0.0.0 # 确保绑定所有网络接口 ``` 若绑定地址为 `localhost` 或 `127.0.0.1`,外部请求会被拒绝[^2]。 --- #### 2. **路径映射不匹配** - **控制器接口路径校验** 检查后端代码中的 `@RequestMapping` 或 `@GetMapping` 等注解定义的接口路径是否与请求路径一致。例如: ```java @RestController public class DemoController { @GetMapping("/api/test") // 实际接口路径 public String test() { return "OK"; } } ``` 若浏览器请求 `http://localhost:21090/test`,而接口路径为 `/api/test`,则触发 404 错误[^3]。 - **反向代理配置冲突** 若使用 Nginx 等反向代理,需确认代理规则是否适配新端口: ```nginx location /api/ { proxy_pass http://localhost:21090/; # 代理路径需与后端接口路径匹配 } ``` 若代理路径 `/api/` 与后端接口路径不匹配,请求会被错误路由[^3]。 --- #### 3. **端口冲突或防火墙限制** - **端口占用检查** 运行以下命令确认 `21090` 端口未被其他进程占用: ```bash lsof -i :21090 # Linux/Mac netstat -ano | findstr ":21090" # Windows ``` 若端口被占用,需终止冲突进程或更换端口[^4]。 - **防火墙/安全组规则** 确保操作系统防火墙或云服务器安全组已放行 `21090` 端口的入站流量: ```bash # Linux 示例(ufw) sudo ufw allow 21090 ``` --- #### 4. **服务未正确加载资源** - **静态资源路径配置** 若服务提供静态资源(如 HTML、JS),需检查资源目录配置: ```java // Spring Boot 示例 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/"); } } ``` 若资源路径配置错误,访问根路径 `/` 时可能无法加载默认页面[^2]。 --- ### 排查步骤总结 1. **验证服务监听状态** 通过 `netstat` 确认端口 `21090` 处于监听状态,且绑定地址为 `0.0.0.0`。 2. **检查配置文件** 确保 `server.port` 和 `server.address` 正确,重启服务使配置生效。 3. **测试基础连通性** 使用 `curl` 直接访问接口: ```bash curl -v http://localhost:21090/api/test ``` 观察响应状态码和日志输出。 4. **审查日志文件** 查看服务日志中是否有请求记录或异常堆栈,例如: ``` [ERROR] 2024-06-20 10:00:00.123 [http-nio-21090-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] threw exception ``` 5. **逐步简化场景** 暂时关闭反向代理,直接通过 `localhost:21090` 访问服务,排除代理配置干扰。 --- ### 示例修正代码(Spring Boot) ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } @RestController @RequestMapping("/api") // 统一接口前缀 class DemoController { @GetMapping("/test") public String test() { return "Service is running on port 21090"; } } ``` --- ### 相关问题 1. 如何确认服务是否绑定到了指定端口? 2. 反向代理导致 404 错误的常见原因有哪些? 3. 服务日志中如何快速定位 404 错误来源? [^1]: 检查服务端口监听状态 : 绑定地址与外部访问限制 [^3]: 接口路径与代理配置一致性 [^4]: 端口冲突排查方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值