V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
awanganddong
V2EX  ›  程序员

http 跨域的问题(hsts)

  •  
  •   awanganddong · 2021-02-20 09:43:57 +08:00 · 1834 次点击
    这是一个创建于 1405 天前的主题,其中的信息可能已经有所发展或是发生改变。

    浏览器请求后台接口报错如下

    Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.
    

    后台 nginx 配置了 strict-transport-security 参数 查看日志未收到前端请求 前端清楚缓存后再次请求又成功了,过会就会又失败 定位到问题是请求接口是 https 的但是接口请求的是 http

    但是对于出现这种情况的原因还是不太清楚。

    这是知乎上边的一篇讲解。

    https://zhuanlan.zhihu.com/p/245511588

    6 条回复    2021-02-20 17:49:29 +08:00
    awanganddong
        1
    awanganddong  
    OP
       2021-02-20 09:45:49 +08:00
    当用户已经安全的登录开启过 htst 功能的网站 (支持 hsts 功能的站点会在响应头中插入:Strict-Transport-Security) 之后,支持 htst 的浏览器(比如 chrome. firefox)会自动将这个域名加入到 HSTS 列表,下次即使用户使用 http 访问这个网站,支持 htst 功能的浏览器就会自动发送 https 请求(前提是用户没有清空缓存,如果清空了缓存第一次访问还是明文,后续浏览器接收到服务器响应头中的 Strict-Transport-Security,就会把域名加入到 hsts 缓存中,然后才会在发送请求前将 http 内部转换成 https ),而不是先发送 http,然后重定向到 https,这样就能避免中途的 302 重定向 URL 被篡改。进一步提高通信的安全性。
    awanganddong
        2
    awanganddong  
    OP
       2021-02-20 09:52:49 +08:00
    我这样理解不知道对不对

    1.用户首次 http 请求,首先发 option 预检请求(走 http ),通过之后正式 post 请求(走 http)。 这时候 strict-transport-security 会把域名加入 hsts 缓存中。
    2.第二次请求,预检请求(走 http ),通过之后正式请求(走 hsts 缓存)。跨域失败。
    no1xsyzy
        3
    no1xsyzy  
       2021-02-20 12:14:46 +08:00
    一旦 HSTS 就不要想着 HTTP,根本没有 “接口请求的是 http” 一说,都是 HTTPS,一旦在 HSTS 期限内,永远不可能发出 HTTP,发出来请直接报 security bug 给对应浏览器。( localhost 除外)

    不知道你为什么会 3xx,OPTIONS 似乎不允许 3xx
    markgor
        4
    markgor  
       2021-02-20 12:36:55 +08:00
    如 3L 所言,
    1 、HSTS 开启后,时间范围内走的都是 HTTPS 。
    2 、ajax 跨域流程:
    浏览器判断 ajax 是否跨域,
    发送 option 请求到 ajax 请求的 url
    返回 header 包含允许跨域信息再次发送 ajax 请求。


    你现在的问题应该是说 ajax 首次访问的是 http 的 url 地址,
    导致 option 访问的也是 http 地址。
    既然是跨域,前端为何不直接写死请求地址为 https 呢?
    awanganddong
        5
    awanganddong  
    OP
       2021-02-20 13:19:23 +08:00 via Android
    就是我后台提供的接口是 https 的{http 也可以用},但是前端请求我接口用的是 http,然后就报错了。

    我现在对报错这个环节不太理解。
    beastk
        6
    beastk  
       2021-02-20 17:49:29 +08:00 via iPhone
    hsts 无法降级
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3266 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:57 · PVG 19:57 · LAX 03:57 · JFK 06:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.