浏览器中的302你真的知道吗

本文讲述了在浏览器环境中,当遇到302重定向时,XHR和fetch如何处理。默认情况下,两者都会自动重定向,但fetch提供了`redirected`属性来判断重定向,而XHR可以通过比较`responseURL`来检测。fetch虽然能阻止重定向,但无法获取重定向URL,而XHR则可以。文章通过实例探讨了如何在不同情况下拦截并处理302重定向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在公司小程序内嵌H5相关页面在做收银台区分跳转时,了解到了一些有关浏览器302相关的有趣故事,分享给大家。

地址栏的302

在网页输入一个地址后,如果当前地址返回302,301的状态码。浏览器会自动跳转到Response header中指定的Location指定的地址。如下图:


到这里开始我们进入我们今天要聊的正题:
在地址栏浏览器帮我们自动重定向了,那我们如果通过XHR来发送请求后
1:如果相应是302的话,也会帮我们自动跳转吗?
2:如果自动跳转,我们如何知道已经发生了跳转呢?
3:有没有什么办法可以拦截这种行为?
心急的同学直接看最后两部分即可,中间是一些演示DEMO以及示例。

业务场景

之前的业务再跳转收银台时,会携带大量的参数直接通过window.location交给后端去处理,收银台的页面属于后端PHP页面。在小程序开发过程中,由于后端接口逻辑较多,所以决定通过前端解析后端PHP页面接口来获取订单号然后调用小程序路由跳转函数去走小程序的收银台。所以,前端不能再走window.location的方式去直接扔给后端去处理。具体处理流程见下图:

可以看到,当我们通过XHR请求后端PHP接口时,该接口可能正常情况下返回200状态码,并且返回HTML页面。我们通过正则解析PHP页面可以拿到订单号,通过判断页面存在订单号的数量可以区分出来是否是第一次支付。这里有个业务情况就是可能存在0元课的情况,用户通过选优惠券等等满足不需要支付直接完成订单的情况。所以前端需要主动去调用一次show的接口来判断。而这个show接口就是本文的重点:
无需支付的情况下他会返回302状态码。需要支付的情况下,他会返回200的状态码。我通过判断状态码来选择让路由跳向不同的程序。是吧?很简单的逻辑。基于axios。我写出了如下的代码

  ..... 跳转小程序订单完成页
  return
}
.....跳转小程序收银台

因为代码过于简单,我甚至没有测试,直接上灰度。

然后,发现我的if分支不生效。
然后,我本地开始测试,发现好神奇,一直是200状态码。

故事开始

因为axios在浏览器环境下是基于XHR的。所以我本地写了一个简单的测试DEMO:
服务端:

前端页面:

结果跟我想的一样。302的影子甚至连看都没看到。

这就很离谱。

难道浏览器这也帮我自动重定向了?实际上还真是。XHR会自动帮你重定向。那我们有没有什么办法知道发生了重定向呢?也是可以的:

所以我们的代码应该这么写:

// consfig.url = /api
// responseUrl = http://localhost:3000/cart
if(!request.responseURL.includes(config.url)){
  ..... 跳转小程序订单完成页
  return
}
.....跳转小程序收银台

我们修改一下我们的小Demo让他能判断出来发生了重定向。


我们已经能成功的判断出来是否发生了重定向了。所以我们的需求终于可以搞了。

解决了这个问题,我们应该更深入的思考一下。毕竟我们不是那么肤浅的人。

都21世纪嘞,我们应该试试Fetch,好滴。我们去试试Fetch:

前端页面【这玩意就是用起来比XHR简单,我喜欢】:

跑一下试试

不愧是新一代。通过测试发现,response中有一个redirected 的值,可以让我们直接拿来判断是否发生了重定向。我们查阅一下MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/Response。

仔细查阅文档,

fetch似乎可以让我们手动重定向。我们试试这个特性。


确实帮我们把重定向拦截掉了,但是,查看响应接口。我们似乎也没有办法拿到重定向地址。
大家可以看这个ISSUE:https://github.com/whatwg/fetch/issues/601 。规范的定义本就如此。它的意思是不让浏览器去重定向,阻止重定向。并不是让我们来手动重定向。
所以我们没有办法去手动重定向。这种情况下 我们有没有什么解决方案呢?
通过查阅资料:
https://www.ruanyifeng.com/blog/2020/12/fetch-tutorial.html

大家注意:这里写的不对哈!是错误的实例,大佬也有犯错的时候🤣。
这个大佬的文章:https://github.com/mrlmx/blogs/issues/2。可以参考这篇文章,写的非常好,最后比较完美的诠释了如何手动重定向。需要fetch与XHR来配合完成拦截重定向并获取重定向地址。由于大佬写的过于完美,我就不展示了。核心就是:

总结

1:默认情况下,不论是XHR还是fetch都会自动重定向。
2:fetch提供了属性值来判断是否发生了重定向,XHR可以通过比对responseURL与请求URL是否相同来判断是否发生了重定向。
3:fetch提供了阻止重定向的能力,但是无法获取重定向URL。XHR可以阻止,并且可以拿到被阻止重定向的值,这是比fetch高级一点的地方。

参考资料:

fetch:https://developer.mozilla.org/zh-CN/docs/Web/API/fetch
XHR:https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest
Response:https://developer.mozilla.org/zh-CN/docs/Web/API/Response
ISSUE:https://github.com/whatwg/fetch/issues/763
ISSUE:https://github.com/whatwg/fetch/issues/601
BLOG:https://github.com/mrlmx/blogs/issues/2

<think>嗯,用户问的是关于电脑浏览器网页跳转的介绍。首先,我需要明确网页跳转的具体含义。网页跳转通常指的是当用户点击链接、提交表单或访问某个URL时,浏览器自动加载另一个页面的过程。这可能包括多种类型,比如HTTP重定向、JavaScript跳转或者HTML的meta标签跳转。 接下来,我应该分步骤解释不同的跳转方式。HTTP状态码中的3xx系列,比如301和302,是常见的服务器端跳转方式。这时候需要说明这些状态码的区别,比如301是永久重定向,而302是临时重定向。同时,用户可能不太了解这些状态码的实际应用场景,比如网站改版时用301,临时维护用302。 然后是客户端跳转,比如使用HTML的meta标签或者JavaScript。这部分需要详细说明如何通过meta标签的refresh属性实现自动跳转,以及JavaScript中location.href和replace方法的区别。这里要注意语法正确,比如用$$...$$包裹代码示例,确保LaTeX格式正确。 另外,用户可能想知道不同跳转方式对SEO的影响,比如301有利于传递权重,而JavaScript跳转可能不被搜索引擎优先抓取。这部分需要简明扼要地提到,帮助用户理解实际应用中的考虑因素。 还要考虑用户的实际需求,他们可能遇到网页跳转的问题,比如循环重定向或者跳转失败,这时候需要给出一些排查建议,比如检查网络、清除缓存或使用开发者工具查看网络请求。 需要注意的是,回答结构要清晰,分点列出不同类型的跳转方式,每种方式的具体实现和示例,以及注意事项。同时,确保使用中文,避免专业术语过于晦涩,必要时举例说明。比如在讲meta标签时,给出具体的HTML代码示例,并用$$...$$格式包裹,符合系统级指令的要求。 最后,总结一下网页跳转的核心机制,强调服务器端和客户端的区别,以及常见应用场景,帮助用户全面理解。同时提醒安全性和用户体验的问题,比如避免过多跳转导致用户流失,确保跳转的必要性和合理性。 在整理回答时,还要检查LaTeX语法是否正确,特别是行内公式用$...$,独立公式用$$...$$,比如HTTP状态码的例子需要用正确的格式。另外,代码示例要正确使用反引号,并确保中文表达流畅,结构层次分明。</think>以下是关于电脑浏览器网页跳转的详细介绍: --- ### 一、网页跳转的核心机制 网页跳转是通过 **HTTP协议** 或 **客户端脚本** 实现的页面自动导航行为,主要分为两类: 1. **服务器端跳转**(HTTP重定向) - 由服务器返回特定状态码(如`301`、`302`)触发。 - 示例:访问旧网址时,服务器返回`HTTP/1.1 301 Moved Permanently`,并指定新地址。 2. **客户端跳转** - 通过浏览器解析HTML标签或执行JavaScript代码实现。 - 示例:HTML的`<meta http-equiv="refresh">`标签或JS的`window.location.href`。 --- ### 二、常见跳转方式及实现 #### 1. HTTP状态码跳转 - **301永久重定向** 服务器返回状态码`301`,浏览器自动跳转到新地址,适用于网站永久迁移。 语法示例(服务器配置): ```nginx location /old-url { return 301 https://example.com/new-url; } ``` - **302临时重定向** 状态码`302`表示临时跳转,常用于A/B测试或临时维护页面。 PHP实现示例: ```php <?php header("Location: https://example.com/temp-page", true, 302); exit; ?> ``` #### 2. HTML Meta标签跳转 通过`<meta>`标签指定跳转时间和目标地址: ```html <!DOCTYPE html> <html> <head> <meta http-equiv="refresh" content="5; url=https://example.com/new-page"> </head> <body> <p>5秒后自动跳转...</p> </body> </html> ``` - `content="5; url=..."`:5秒后跳转至指定URL。 #### 3. JavaScript跳转 - **直接跳转** ```javascript window.location.href = "https://example.com/new-page"; ``` - **替换当前历史记录** ```javascript window.location.replace("https://example.com/new-page"); ``` --- ### 三、注意事项 1. **SEO影响** - 优先使用`301`跳转以传递搜索引擎权重。 - 避免过多使用JavaScript跳转,部分爬虫可能无法解析。 2. **用户体验** - 明确提示跳转倒计时(如显示“3秒后跳转”)。 - 避免无限重定向循环(可通过浏览器开发者工具的 **Network** 面板检测)。 3. **安全性** - 警惕通过跳转实现的钓鱼攻击(如伪造银行登录页)。 --- ### 四、排查跳转问题 若跳转异常,可尝试: 1. 清除浏览器缓存(`Ctrl+Shift+Del`)。 2. 使用无痕模式测试。 3. 通过`curl -I https://example.com`查看原始HTTP响应头。 --- 通过上述机制,网页跳转实现了网站导航、流量引导和错误处理等功能。合理使用跳转技术可提升用户体验,但需注意避免滥用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值