首页 > 其他分享 >HTTP重定向

HTTP重定向

时间:2023-04-26 23:46:11浏览次数:35  
标签:HTTP 重定向 URL 301 访问 请求


基本含义

在 HTTP 请求服务中,服务器可以通过返回一个状态码为 3xx 的重定向响应来告知调用方(通常是浏览器)当前访问的链接需要进行重定向访问,响应头中会带有一个Location 字段,注明重定向后的目的地址。浏览器接收到这个重定向响应后,会访问 Location 中指定的链接。

 



用户对于这个过程通常是没有太明显的感知的,一切都是在客户端和服务端之间完成,用户最直接的感知就是页面响应的时间可能稍微增加。不过如果在重定向过程中出现其他异常,例如重定向的请求不存在或者网络超时等,用户还是能够明显感受到页面加载缓存的。

重定向相关的状态都是 3XX 的形式,常见的主要有一下9种状态码:

 

永久重定向

从上面整理的表格可以知道,301 和 308 状态码都属于永久重定向。正如字面意思,永久重定向代表原来的 URL 资源已经不可用,替换成一个新的 URL 资源。所以当客户端识别到响应头中带有这两个状态码时,会更新原来请求 URL 资源记录。

301 和 308 的主要区别是,重新发起新请求时,301 会发起 GET 请求,而 308 会使用原来的方法发起新的请求。在规范中,其实 301 本来也是不允许新请求改变其请求方法的,但是由于市面上现有的浏览器厂商都使用了 GET 方法来发起新的请求,所以才创建了 308 这个状态码来处理需要使用非 GET 方法进行重定向的场景。
临时重定向

302、303、307 都属于临时重定向。当原来的 URL 资源因为某些不可预测的因素导致临时无法访问时,可以通过临时重定向将请求转移到另外一个资源。由于重定向的资源是临时的,因此客户端不会将这个临时的资源缓存至本地,在下一次发起请求时依旧会使用原来的资源。

如果在资源访问时,服务方想提供一些临时的展示页,通常可以使用 303 进行临时重定向。

302 与 307 的关系与永久重定向中的 301 与 308 的关系类似,这里就不再赘述。

其他重定向方式

在生产中常用的几种重定向,其作用优先级跟我们访问资源时文件的请求处理顺序基本一致,即
HTTP > HTML > JavaScript

 



上面提到的重定向方式,都是通过在响应体头部的 Location 字段指定新的 URL 资源实现的,但是这个操作只能是由服务端控制的,属于 HTTP 的协议范畴。在不方便控制服务端的场景下,还可以通过 HTML 的 <meta> 标签进行 HTML 重定向,或者 DOM 实现 JavaScript重定向。
HTML 重定向

在 HTML 文件中,通过 <meta> 标签进行指定:

http-equiv="Refresh" 指定启动重定向,content 后面的数字表示执行重定向的等待时间,单位为秒;后面的 URL 则指定重定向的资源链接。
JavaScript 重定向

这个比较常见,通过指定 window.location 即可实现重定向,这里不再展开。
常见的重定向场景

1、保证原有链接可用

由于网站的维护或者链接的调整,服务器内部的 URL 可能出现变更,但为了保证已经被外部引用的链接以及用户收藏的书签依然可用,这里可以使用重定向。

2、提高网站的可达率

有时候用户访问一个 URL 时,不一定能准确记住完整的链接,针对同一个网站的不同别名,分别使其重定向至该网站的指定 URL,能有效提升用户访问的可达率。比如 www.baidu.com 和 baidu.com 都能访问到百度的页面。

3、强制跳转 HTTPS

当页面支持 HTTPS 时,如果用户通过 HTTP 协议进行访问,那么服务端通常会强制指定重定向跳转进行 HTTPS 访问。需要注意的是,POST 请求经过 301 和 302 重定向后,会重新以 GET 方法进行请求,此时表单内的请求参数会丢失,可能会导致请求失败,这在服务器开发过程中尤其需要注意。

4、避免页面重复提交

对于像编辑、删除等提交表单的操作,我们需要避免用户通过刷新页面进行重复提交,因此可以将其重定向到临时的进度展示页,比如 303。对于响应时间较长的页面请求也可以这么处理。这样,用户能够感知到操作已经在执行,即便进行刷新或者重新访问,也不会重复触发提交的操作。

标签:HTTP,重定向,URL,301,访问,请求
From: https://www.cnblogs.com/saklfasjf/p/17357735.html

相关文章

  • http请求方式
    http最大的作用就是确定了请求和响应数据的格式。常见的请求方式:get 方法发送一个请求来取得服务器上的某一资源。post方法向url指定的资源提交数据或附加新的数据。put方法put方法跟post方法很像,也是向服务器提交数据,但是put方法指向了资源在服务器上的位置......
  • OkHttp 工具类
    OkHttp依赖包:<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.8.1</version></dependency><dependen......
  • httpclient请求
    varClient=newHttpClient();Client.DefaultRequestHeaders.Clear();Client.DefaultRequestHeaders.Add("Header1","Value1");Client.DefaultRequestHeaders.Add("Header2","Value2");Client.DefaultRequestHeaders.Add......
  • Tinyhttpd:运行测试【1】
    一、问题引入想分析http开源程序Tinyhttpd,首先应复现httpserver和client之间的请求和相应开源仓库地址:https://github.com/EZLippi/Tinyhttpd.git二、解决过程git项目gitclonehttps://github.com/EZLippi/Tinyhttpd.git准备CGI环境由于请求需要使用cgi,故要下......
  • 配置harbor服务器的https
    一、配置CA证书(1)创建工作目录[root@docker~]#mkdir-pv/project1/harbor/certs/{ca,harbor-server,docker-client}(2)进入到harbor证书存放目录[root@docker~]#cd/project1/harbor/certs/[root@dockercerts]#lltotal0drwxr-xr-x2rootroot6Feb2709:06ca......
  • OkHttp实现全局过期token自动刷新
    原文地址www.cnblogs.com遇到问题:当前开发的App遇到一个问题:当请求某个接口时,由于token已经失效,所以接口会报错。但是产品经理希望app能够马上刷新token,然后重复请求刚才那个接口,这个过程对用户来说是无感的。也就是静默自动登录,然后继续请求:请求A接口-》服......
  • 浏览器 http 200(from cache) 和 304
    1,Last-Modified设置header("Last-Modified:".gmdate("D,dMYH:i:s",time())."GMT"); Last-Modified虽然使用了缓存,但是每次打开页面依然需要向服务器发起http请求,浏览器根据用户的$_SERVER['HTTP_IF_MODIFIED_SINCE']来判断浏览器的内容是否......
  • okhttp3的基本使用(post发送json示例)
    依赖<!--https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><ve......
  • 【谷歌插件开发】获取当前网站COOKIE并上报HTTP-API
    一背景由于本人每天需要登录网站查看数据并分析统计汇总,而每次机械式地搜索和简单计算,十分繁琐。我们可以写个定时任务,每天根据cookie获取网站数据并遍历统计。脚本得以成功执行的关键是需要获取到COOKIE故,写了个谷歌插件用来上报COOKIE二代码总目录三上代码manifest......
  • C# abp框架Http辅助类
    一、定义接口为什么要定义接口而不直接使用静态类,因为接口可以注入缓存对象,这样就能从缓存中读取指定的请求头usingSystem;usingSystem.Collections.Generic;usingSystem.Net.Http;usingSystem.Text;usingSystem.Threading.Tasks;usingVolo.Abp.Application.Service......