V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daijinming
V2EX  ›  程序员

谁对 HTTP 的重定向理解比较熟悉,能不能讲解下客户端重定向和服务端重定向有什么异同

  •  
  •   daijinming · 2018-12-13 14:23:50 +08:00 · 3304 次点击
    这是一个创建于 2170 天前的主题,其中的信息可能已经有所发展或是发生改变。
    21 条回复    2021-08-01 21:48:48 +08:00
    qwx
        1
    qwx  
       2018-12-13 14:32:16 +08:00
    在我的理解中,服务端的重定向分为两种,一种是 redirect,一种是 rewrite,rewrite 是客户端无感知的,就是地址栏不变化。redirect 会给浏览器一个状态码( 301 或 302 ),浏览器实现跳转。客户端重定向我理解的是,状态码虽然是 200,但其内容或 http 头中有跳转指令,浏览器会因为执行相关 js 代码或识别特定 http 头进行跳转操作。
    daijinming
        2
    daijinming  
    OP
       2018-12-13 14:39:29 +08:00
    在处理第三方用户验证,经常会遇到 重定向的问题,比如接入 CAS、QQ 互联之类的,这种跳转应该都是 服务器 redirect
    goofool
        3
    goofool  
       2018-12-13 14:44:16 +08:00
    HTTP Redirect 都是协议规定好的,还分什么客户端和服务端吗?你是想问 HTTP Redirect 和服务器调度(Forward)的区别吧
    HanMeiM
        4
    HanMeiM  
       2018-12-13 14:44:20 +08:00
    QQ 互联、github 这种 OAtuh 的应该先是客户端的跳转,然后请求自己的服务器,服务器重定向到第三方去拿东西
    daijinming
        5
    daijinming  
    OP
       2018-12-13 14:56:14 +08:00
    @goofool 请讲讲
    goofool
        6
    goofool  
       2018-12-13 15:27:06 +08:00
    Librazy
        7
    Librazy  
       2018-12-13 15:30:51 +08:00 via Android
    还有一种内部重定向,HSTS 的 307 是客户端内部产生的,从 http 重定向到 https
    t6attack
        8
    t6attack  
       2018-12-13 15:46:51 +08:00
    前者在 http 通道本身 定义,后者在 http 通道内传输的页面 定义。

    假设 A/B 两个 url 是两条通道:
    前者是 A 通道上标注:此通道转向 B 通道。浏览器看到以后,转向 B 通道。
    后者是 A 通道内传输一个页面,浏览器解析该页面,根据解析结果,获知要转向 B 通道。
    t6attack
        9
    t6attack  
       2018-12-13 15:52:55 +08:00
    前者:服务端 、后者:客户端。
    zpf124
        10
    zpf124  
       2018-12-13 15:58:22 +08:00
    听着像是 javaweb 时候讲的 forward 和 Redirect,有些人讲课就爱把这个叫做 服务端重定向 和 客户端重定向。

    比如 用户访问 个人中心,如果登录过期了, 这时候有两种处理方式。

    1、当前页面返回内容的内容直接就是登录页面, 对于用户来说他 浏览器的访问地址还是 个人中心的 URl,并不知道现在显示的内容是来自于 /login.html 的。(forward)

    2、直接返回 302 告诉 客户端 需要去登录页重新登录。 对用户而言,他能看到浏览器跳转页面了,URl 也变成 /login.html 了。(redirect)
    wleexi
        11
    wleexi  
       2018-12-13 15:58:45 +08:00
    意思是重定向和转发?
    WordTian
        12
    WordTian  
       2018-12-13 16:15:45 +08:00 via Android
    客户端一般是用 js 跳转
    服务端一般是用 301 状态码,加 Location 响应头
    WordTian
        13
    WordTian  
       2018-12-13 16:16:34 +08:00 via Android
    @WordTian 噢,是 30x 状态码
    binux
        14
    binux  
       2018-12-13 16:25:26 +08:00 via Android
    这是道语文题
    passerbytiny
        15
    passerbytiny  
       2018-12-14 09:11:26 +08:00
    HTTP 重定向就一个解释,HTTP 状态码 3XX,常见的是 301。浏览器访问 URL 收到 3XX 状态码的时候,需要将当前访问的 URL 替换成新的 URL,是替换不是跳转,所以重定向后是不能返回的。

    HTTP 重定向是 HTTP 协议的一部分,只是协议,不是技术。客户端重定向和服务端重定向应该是你框架内部的叫法,是技术方案,跟 HTTP 重定向不是一回事。但是一般来说,提到重定向或 Redirect,指的就是服务器端返回 301 状态码。你这个“服务器端重定向”是个相当不通用的叫法。
    yuedingwangji
        16
    yuedingwangji  
       2018-12-14 09:25:58 +08:00 via Android
    rewrite 状态栏是会变化的 …
    daijinming
        17
    daijinming  
    OP
       2018-12-14 10:46:56 +08:00
    @passerbytiny 再问,在网站上点击 QQ 登录,跳转到 QQ 登录界面,QQ 登录成功后再跳转回来,应该不是重定向是吗?
    passerbytiny
        18
    passerbytiny  
       2018-12-14 10:55:33 +08:00
    @daijinming #14 点击登录不是重定向,登陆成功后跳回来是重定向,服务器判定登录成功后,回发送 http301 的。
    daijinming
        19
    daijinming  
    OP
       2018-12-14 11:00:36 +08:00
    @passerbytiny #18 服务器判定登录成功后,回发送 http301 的,浏览器收到后是不是还是要发出 HTTP 请求到当前功能网站那?
    jimzhong
        20
    jimzhong  
       2018-12-14 12:01:57 +08:00
    @daijinming 是。打开开发者工具的“网络”卡就能看到。
    xzsljc
        21
    xzsljc  
       2021-08-01 21:48:48 +08:00
    还有一种内部重定向,HSTS 的 307 是客户端内部产生的,从 http 重定向到 https
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3537 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:23 · PVG 12:23 · LAX 20:23 · JFK 23:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.