关于 https://localhost, https://127.0.0.1, CORS 那些事 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
jianglibo
V2EX    程序员

关于 https://localhost, https://127.0.0.1, CORS 那些

  •  
  •   jianglibo
    PRO
    4 小时 4 分钟前 2073 次点击

    前端在开发的过程中有没有碰到过 CORS 的坑呢?欢迎提问,我也乐于分享(不是我更懂,只是碰到过而已)。

    mkcert可以生成证书并将证书加入操作系统的信任列表,因此将证书配置到你的测试环境之后,可以直接访问 https://localhost:3000 而不会有任何警告。 要测试类似生产环境的 CORS ,比如前后端完全分离的架构,https 必不可少。

    那么如何在局域网内完成类似的效果呢?比如 https://192.168.3.168 。或者使用 vscode remote ssh 的时候,在本地打开本地的浏览器可以访问,但是在 remote 端,有时候需要访问一下呢?也就是说需要一个分布式的 mkcert ,cert-ctrl,这个是我们写的。self-ca 在 这里生成,在每个需要访问你的测试服务的电脑上安装客户端即可。对于某些生产环境的管理页面,如果不需要公开访问,直接用自签发的 mTLS 即可。

    题外话: 有些人对文章的内容不感兴趣,对文章中提到别人的软件也没关系,唯独对提到作者自己的软件耿耿于怀,其实大可不必,最好的做法是不要去理这样的贴子如果你觉得没有价值。大家都不理它,它就自然下沉消失不见了。

    36 条回复    2026-01-28 12:06:21 +08:00
    willbeok
        1
    willbeok  
       3 小时 14 分钟前
    能 get 到需要解决的场景问题,但这个工具的介绍有点看不太明白。mkcert 安装后浏览器会信任证书,cert-ctrl 也能自动完成信任? self-sa 是一个命令行,没看明白作用是什么,有没有这套组合的系统架构图说明一下呢
    ff521
        2
    ff521  
       3 小时 10 分钟前
    只要不是 AI 生成的内容就好 (主要是和本站宗旨不符,回复都不能 AI,主题反而随便 AI 生成,让人感觉割裂)
    Rache1
        3
    Rache1  
       3 小时 4 分钟前
    你想要在其机器也能获得 https 访问,只需要按照 mkcert 的说明,把证书发其他机器然后安装信任根证书就好了。


    https://github.com/FiloSottile/mkcert?tab=readme-ov-file#installing-the-ca-on-other-systems:~:text=Installing%20the%20CA,key.pem.
    jianglibo
        4
    jianglibo  
    OP
    PRO
       2 小时 59 分钟前
    @willbeok 如果你注册一下, 这个架构就非常清晰了,cert-ctrl 登陆之后,类似于 cloudflare,tailscale 客户端,它和[中心服务器]( https://api.cjj365.cc/r/v2ex1)交互,你在 web 端的 CA ,证书全部会自动分发,这样描述你能明白吗?
    chaoshui
        5
    chaoshui  
       2 小时 59 分钟前
    我认为解决这个问题的方式是使用代理,而不是在的操作系统里安装莫名奇妙的证书。
    Vite/Webpack/Next.js 不都有代理解决方案吗?
    jianglibo
        6
    jianglibo  
    OP
    PRO
       2 小时 55 分钟前
    @Rache1 一般来说证书固定在提供服务的机器上,http server,mail server etc. 而 ca 需要导入到需要访问这个服务的机器上,mkcert 的使用场景本机,如果你要达成从其它机器访问又变成手动模式了,如果是手动模式,那么你直接用 openssl 好了。工具的目的是让你不要去折腾,或者一次性设置,在整个职业生涯中可重复利用以节约时间和脑力。
    xitler
        7
    xitler  
       2 小时 53 分钟前
    @chaoshui +1 看的我有点莫名其妙了
    jianglibo
        8
    jianglibo  
    OP
    PRO
       2 小时 53 分钟前
    @chaoshui 代理就是避开了 CORS ,你可能需要更深层的思考和实践。访问[这里]( https://api.cjj365.cc/r/v2ex1),然后启用 chrome 的 dev panel ,仔细观察请求,你会更深的理解这个问题。
    jianglibo
        9
    jianglibo  
    OP
    PRO
       2 小时 46 分钟前
    @xitler 为了便于你理解,比如有一个 api 服务器, https://api.some.where.support.cors , 你从服务器一侧调用没有任何问题,但是你直接从你的浏览器调用这个 api 为发生什么, 想象一下,实践一下,不会在感到迷惑,提高了自己的水平.
    jianglibo
        10
    jianglibo  
    OP
    PRO
       2 小时 44 分钟前
    @xitler 或者你直接从浏览器调用我的 api 服务器作为测试好了 https://api.cjj365.cc , 我的设置不允许除了 https://cjj365.cc 之外的网页调用。
    Rache1
        11
    Rache1  
       2 小时 28 分钟前
    @jianglibo 你这不也是要在访问侧安装东西吗,mkcert 只是需要你把那个 CA 导入到访问侧的主机上就好了(基于这个 CA 生成的证书都不需要在管了),还不需要额外装软件呢。
    jianglibo
        12
    jianglibo  
    OP
    PRO
       2 小时 22 分钟前
    @Rache1 就是涉及到 ca 的复制、导入,系统重装之后就全部要重来了,原来的证书和 ca 都不见了,cert-ctrl 不需要在机器之间复制,重装系统也没有关系。当然也不是没有代价,就是你提到的需要安装客户端。
    zcf0508
        13
    zcf0508  
       1 小时 57 分钟前
    加证书不解决跨域问题吧
    liaozzzzzz
        14
    liaozzzzzz  
       1 小时 53 分钟前 via Android
    nginx:?
    shintendo
        15
    shintendo  
       1 小时 48 分钟前
    @jianglibo "代理只是避开了 CORS" 这不就是目的吗?叽里咕噜说一堆什么呢
    jianglibo
        16
    jianglibo  
    OP
    PRO
       1 小时 47 分钟前
    @zcf0508 从机制上来说证书和 cors 关系不大,但在实际使用中密切相关。 你可以试试看,http://localhost:3000 然后 cors 请求一个 https 或者 http 的第三方站点,你就会体会到为什么相关,chrome 可能甚至不允许你用 http 跨域。
    jianglibo
        17
    jianglibo  
    OP
    PRO
       1 小时 44 分钟前
    @shintendo 你不明白,而且也不想进步,那也没办法,我是希望能帮助到有求知心的人。避开 CORS 就代表 CORS 不需要了吗?你作为前端甚至不知道 CORS 的使用场景,还叽里咕噜。
    v2er119
        18
    v2er119  
       1 小时 40 分钟前
    如果在代理上用,请求和响应的内容都是可以解密?
    jianglibo
        19
    jianglibo  
    OP
    PRO
       1 小时 34 分钟前
    @v2er119 代理这个词不准确,刚才评论提到的代理都是在公司内部开发时为了避开 CORS 而为之,属于代取,但是不能暴露进入生产环境之后可能遇到的 CORS 问题。
    pingdog
        20
    pingdog  
       1 小时 26 分钟前 via iPhone
    引用 @shintendo 的话“叽里咕噜说一堆”

    从头到尾看了两遍,才发现 OP 只是在推广自己的项目
    > 也就是说需要一个分布式的 mkcert ,cert-ctrl ,这个是我们写的。

    dev env 直接让 SRE 在 cors policy 加多一个 localhost 不就行了吗,搞这么复杂,反正 dev 上的资源随便
    xitler
        21
    xitler  
       1 小时 11 分钟前
    @jianglibo ?那我问你,如果你这个证书,泄露了怎么办,谁都可以远程调用你的生产环境
    xdzhang
        22
    xdzhang  
       1 小时 5 分钟前
    前段时间遇到 2 回这个情况,当时还是挺烦的.
    jianglibo
        23
    jianglibo  
    OP
    PRO
       1 小时 4 分钟前
    @pingdog 那 Cookies + CORS 如何解决?必须用 https 了吧。:),所以在 chrome 下你无法调试登陆,在你提到的场景下,更加需要 cert-ctrl ,下次你公司碰到这个问题时,希望你能想到这个贴子。

    Cross-site cookies REQUIRE SameSite=None; Secure
    But Secure cookies cannot be set over HTTP
    jianglibo
        24
    jianglibo  
    OP
    PRO
       1 小时 2 分钟前
    @xitler 选择 device wrapper only ,服务器端无法解密,必须时客户端的私钥解密,私钥从不离开你的服务器。
    sofukwird
        25
    sofukwird  
       1 小时 1 分钟前
    申请个域名指向本地, 然后使用证书管理工具获取对应的证书
    jianglibo
        26
    jianglibo  
    OP
    PRO
       1 小时 1 分钟前
    @xitler 选择有效期 6 天的证书,以保证最大的安全性。
    jianglibo
        27
    jianglibo  
    OP
    PRO
       58 分钟前
    @sofukwird 你的解决方案可行,但经常更新比较烦,自认证证书设个 20 年,整个职业生涯哦都不需要更新了。
    sofukwird
        28
    sofukwird  
       58 分钟前
    CORS 不是坑是特性
    zcf0508
        29
    zcf0508  
       54 分钟前
    @sofukwird #25 我的工具 https://github.com/zcf0508/unplugin-https-reverse-proxy 可以自动在本地添加 host 并且配置证书,无缝调试
    xitler
        30
    xitler  
       53 分钟前
    我觉得不太行,而且也根本不需要什么 https 的 localhost 。开发,测试,rc ,线上环境不做配置隔离吗,一套对一套
    ragnaroks
        31
    ragnaroks  
       50 分钟前
    sofukwird
        32
    sofukwird  
       50 分钟前
    真自签证书的话我更喜欢用 XCA 自签证书管理
    jianglibo
        33
    jianglibo  
    OP
    PRO
       44 分钟前
    @sofukwird XCA 是桌面程序,我的是网页版有什么区别呢?
    ltaoo1o
        34
    ltaoo1o  
       39 分钟前
    重点「前端开发过程的 CORS 问题」,正如前面提到,无论 vite 还是 webpack 都有解决方案并且很方便就能使用,完全没必要额外安装什么东西,尤其是根证书这种存在风险的东西。

    题外话:这就是软文,软文都是被排斥的,因为不够客观,经常是为了推自己的东西,强行构造出一个场景或者问题,从而引入自己的东西,都不考虑实际情况,就比如这篇帖子

    要推广就大大方方的推,好东西从不被排斥
    liuhuihao
        35
    liuhuihao  
       35 分钟前
    ?开发环境的话难道不应该是 vite 或 webpack 的 devServer 转发一下的事儿吗,如果是线上直接配一下后台的 CORS 返回头或者 nginx 代理一下不都能解决问题吗

    为啥要搞个证书嘞
    jianglibo
        36
    jianglibo  
    OP
    PRO
       25 分钟前
    @liuhuihao 我完全理解你的困惑,大部分人可能没有真正接触过前后端完全分离的架构,前端是静态的 html ,所有逻辑在 api 一侧,包括登陆信息等。 当 cors 遇上 cookie 时,现代浏览器会有严格的限制,甚至必须是 https 。https://cjj365.cc 是 html 的静态文件,是用静态文件生成器生成的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3563 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 04:32 PVG 12:32 LAX 20:32 JFK 23:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86