[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site":3,"post-301-302-307-wo-yi-kai-shi-fen":59,"related-301-302-307-wo-yi-kai-shi-fen":83},{"name":4,"url":5,"description":6,"bio":7,"avatar":8,"skills":9,"tools":16,"social":34,"hero":47,"heatmap":52,"icp":55,"police":56,"policeIcon":57,"shortName":58},"时过境迁技术笔记","https:\u002F\u002Fhsgjq.top","一个记录前端与 Node 实践的个人博客，内容围绕 Vue、Nuxt、NestJS 与工程化展开，附源码级的原理笔记。","一名热爱技术的全栈开发者，专注 TypeScript 与 Web 工程化，习惯把踩过的坑和思考记录在这里。","\u002Fuploads\u002Fc485c101-179e-48db-96d1-238693784c38.jpg",[10,11,12,13,14,15],"TypeScript","Vue 3","Nuxt","NestJS","Node.js","工程化",[17,23,28],{"items":18,"title":22},[19,20,21],"Cursor","Git","Chrome DevTools","开发工具",{"items":24,"title":27},[25,26],"Vite","npm","构建工具",{"items":29,"title":33},[30,31,32],"Docker","CI\u002FCD(GitHub Actions)","Vercel","部署运维",[35,39,43],{"href":36,"icon":37,"label":38},"https:\u002F\u002Fgithub.com\u002Fhsgjq","github","GitHub",{"href":40,"icon":41,"label":42},"2971861643@qq.com","mail","邮箱",{"href":44,"icon":45,"label":46},"\u002Frss.xml","rss","RSS",{"lines":48,"subtitle":51},[49,50],"人生若只如初见，","何事秋风悲画扇。","《木兰花·拟古决绝词柬友》",{"enabled":53,"platform":37,"username":54},true,"hsgjq","桂ICP备2024046985号","桂公网安备45011002000103号","\u002Fuploads\u002F72c67ef3-bc86-4b64-b0df-0aba71065050.png","时过境迁",{"slug":60,"title":61,"excerpt":62,"date":63,"updatedAt":64,"tags":65,"content":66,"series":67,"seriesIndex":68,"seriesNav":69,"prev":79,"next":82},"301-302-307-wo-yi-kai-shi-fen","301、302、307 我一开始分不清","永久和临时不只是名字区别，搜索端权重转移不一样。框架给的默认值不一定是你要的那个，得显式写。","2026-09-18","2026-10-19",[12],"改 URL 的时候要考虑旧地址怎么跳，我就用过 \"redirect\": '\u002Fnew' 这种写法，然后以为它是永久重定向。\n\n区别在两点：能不能被缓存，以及权重转不转移。\n\n301 永久。浏览器会记住，之后再访问旧地址直接跳，不再问服务器。搜索引擎会把旧地址的权重转移到新地址，并逐步把旧地址从索引里去掉。用在\"这个页面搬走了，不会再回来\"。\n\n302 临时。每次都问服务器，搜索引擎会保留旧地址、同时收录新地址，长期看就是两个地址并存。用在 A\u002FB、临时活动页、登录后回跳。\n\n307 和 308 分别是 302 和 301 的\"严格版本\"，区别是明确要求请求方法不变。302 在实践中很多浏览器会把 POST 变成 GET，307 不允许这么干。所以只有涉及非 GET 方法的重定向时，307\u002F308 才是对的选择。\n\n我用错的地方在这：框架的 redirect 配置默认给的是 307，不是我以为的 301。看它的归一化代码：\n\n```js\n\u002F\u002F 传字符串时只会补上 to，statusCode 用默认值\n{ to: '\u002F', statusCode: 307, ...你传的内容 }\n```\n\n要 301 必须显式写成对象：\n\n```ts\n'\u002FOld': { redirect: { to: '\u002Fnew', statusCode: 301 } }\n```\n\n后果不是报错，是搜索端长期保留两个地址、权重分散。这种问题不会当天暴露，是几个月后看收录数据才会发现——这也是为什么我认为永久跳转必须写对：它是那种\"错了也没人立刻知道\"的东西。\n\n还有一件更重要的事，是我在旧地址跳转上犯的另一个错，性质完全不同：那条规则被框架注册成了客户端路由，而路由匹配不区分大小写，于是它自己跳自己，把页面主线程打死。这个 bug 的表现是整页卡死，跟\"状态码不对\"完全是两个量级的问题。所以后来凡是涉及大小写的旧地址跳转，我都放到服务端中间件里做，不进 routeRules。\n\n判断标准我最后简化成一句：这个 URL 是不是永远不再回到旧内容。是，就 301；不是，就 302。307 只在需要保方法的时候用，普通页面跳转用不上。\n\n验证方式是一条命令，同时看状态码和 Location：\n\n```bash\ncurl -sI -o \u002Fdev\u002Fnull -w '%{http_code} %{redirect_url}\\n' https:\u002F\u002Fexample.com\u002FOld\n```\n\n只看 -I 的输出容易漏：301 和 307 在响应头形状上只差一个字段名，肉眼看会看错。","Nuxt 与服务端渲染",7,[70,74,75],{"slug":71,"title":72,"seriesIndex":73},"rss-he-sitemap-shi-zen-me-bei-pa","RSS 和 sitemap 是怎么被爬虫看到的",6,{"slug":60,"title":61,"seriesIndex":68},{"slug":76,"title":77,"seriesIndex":78},"hou-tai-bao-cun-wen-zhang-qian-tai","后台保存文章，前台一小时没变",8,{"slug":80,"title":81},"wo-ba-compose-de-override-xie-cuo-zhan","我把 compose 的 override 写错，站点停了二十分钟",{"slug":76,"title":77},[84,91,97,101,105],{"slug":85,"title":86,"excerpt":87,"date":88,"tags":89},"dian-xiang-mu-ye-mian-jiu-si-yi","点「项目」页面就死：一次客户端无限重定向","为了保留旧地址大小写加的一条跳转规则，被注册成了客户端路由；路由匹配不区分大小写，于是它自己跳自己。","2026-10-02",[12,90],"浏览器",{"slug":92,"title":93,"excerpt":94,"date":95,"tags":96},"jian-li-de-xie-gang-hui-bian-cheng","键里的斜杠会变成冒号：清缓存清了个空","按源码里的分组名去匹配存储键，结果一条都没删掉，接口还回 200。返回一个可被证伪的数字，这类问题当场就能发现。","2026-09-30",[12,15],{"slug":76,"title":77,"excerpt":98,"date":99,"tags":100},"SSR 缓存要有主动失效这条通道。密钥两侧必须同值、这个接口不能对公网开、回执要能被打脸（计数）。","2026-09-27",[12],{"slug":71,"title":72,"excerpt":102,"date":103,"tags":104},"生成时机、地址、robots 里要不要写。sitemap 带 lastmod 之后，改动被抓取的速度明显不一样。","2026-04-28",[12],{"slug":106,"title":107,"excerpt":108,"date":109,"tags":110},"gang-deng-lu-jiu-guo-qi-yi-ci","一个 401，查出四个前端机制：缓存回放、隐藏页的 rAF、百分比圆角、缓动过冲","响应头里的 token 被 304 原样回放，把刚签发的新 token 顶掉，表现成刚登录就过期。顺带记三个前端细节：隐藏标签页里 rAF 不执行、扁盒子的 50% 圆角是胶囊、缓动曲线的过冲只有 0.0008。","2026-10-13",[111,112,113,90],"CSS","JavaScript","Vue"]