URL 末尾应该有斜杠「/」吗

date
Feb 1, 2024
slug
trailing-slash-on-url
status
Published
tags
Web
summary
通过一次请求接口 301 报错的 Debug 经过,来聊聊应该怎么更规范的定义服务端接口的路径
type
Post

背景

产生这个疑问的动机是一次意外定位的 BUG。
我们组里一开始的 go web 框架是 go-zero 。这个框架的 router 实现里, path 后是否含有斜杠 / 不作为判定是否为同一地址的标准。举个例子,下面两个路由在 go-zero-router 种将被视为同一个地址,直接调用同一个 handle function。
# www.abc.com/def/
# www.abc.com/def
问题出在更换了路由引擎后。因为对 protobuf 的需要,组内同事直接高速换胎,将框架内的 router 实现换成了 gin 的路由引擎。更换后,前端再次请求原来的地址时,从服务端收到了 301 状态码。
经过排查后,发现是 gin-router 会将上述两个 URL 差异化处理,并且将未定义的 URL 301 重定向到已定义的 URL 上;前端开发的环境下通过 DevServer 在 API 请求中访问这个 URL 的时候,会将重定向的行为直接反映在浏览器上,从而导致原本应该用 XMR 访问的请求直接变成一个 301 跳转,从而导致请求失败。

方案

搞清楚了问题产生的原因,接下来就要看怎么去解决。
从经验上来说,解决问题的思路无非就两条:
  • 调整服务侧路由的配置,去除 URL 末尾定义的斜杠
  • 前端 Proxy 的时候配置 followRedirects 属性,让重定向的内容交由 Proxy 中间件处理
两种方案没有孰优孰劣的区分,且都能很快的解决问题。严格的意义上来说,这个问题不是一个技术点的实现,选择哪个方案取决于哪种更符合日常开发中的规范、更能还原定义时候的语义化信息;同时,如果这个定义也涉及了前端的页面,还需要将对 SEO 等方面的影响纳入考虑范围。

结论

相关资料
notion image
经过对上述地址的查阅和收集,我们可以得出如下结论:
  • 由 Unix 文件名语法演变而来的 URI 定义,在 Path 分段中通过斜线 / 分割不同的路径
  • 对于搜索引擎 Google 来说,不区分两者的权重
  • Google 会遵循 301 的行为,将跳转后的结果与原地址合并
  • 对于已经定义好的路由规范,不建议更换,最好做到项目内统一
因此,最后我们的解决方案是遵循更规范的路径定义方式,去除末尾多余的斜杠,这样更符合我们对接口这个 URI 的描述。

© Krist 2016 - 2024

|