关于请求最后的斜杠|青训营笔记

301 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第二篇笔记
在做抖音项目时,出现了请求打不进后台的问题。
检查了网络,代码,路由配置,都没问题,最后发现是因为请求末尾的/ 。

/douyin/user/和/douyin/user的区别

我们知道,在HTTP请求中,用斜杠分隔的是路径,URL的末尾一般是访问的资源文件。
那么/douyin/user/这个路径代表user是一个目录,浏览器会默认查找对应目录下的默认文件,如果没有则会出现404错误,而/douyin/user代表user的在douyin目录下的一个文件,如果该目录下没有名为user文件,但是发现了名为user的目录,现代浏览器都会自动301重定向到/douyin/user/去。

30x系列http状态码

根据 RFC 7231RFC 7538

  • 301 Moved Permanently
  • 302 Found
  • 303 See Other
  • 307 Temporary Redirect
  • 308 Permanent Redirect 301和308是永久重定向,而其他的可以认为是临时重定向,301和308的行为基本一致,唯一的区别是308不允许原本的POST请求被重定向到GET请求上。

再看临时重定向这边,同样,307也不允许把POST请求重定向为GET请求
302 状态码表示目标资源临时移动到了另一个 URI 上。由于重定向是临时发生的,所以客户端在之后的请求中还应该使用原本的 URI。
注意:由于历史原因,用户代理可能会在重定向后的请求中把 POST 方法改为 GET 方法。如果不想这样,应该使用 307(Temporary Redirect) 状态码。

303 常用于将 POST 请求重定向到 GET 请求,比如你上传了一个文件,服务器发回一个 303 响应,将你导向一个“上传成功”页面。无论原请求是什么请求方法,都会重定向为GET 方法

问题解决

iris-go默认并不支持末尾带斜杠的请求路径,所以请求访问不到,加上配置即可。

iris.WithoutPathCorrectionRedirection

要不要在请求的末尾加上/呢?

  • 如上文所述省略最后的斜线可能会导致一次301重定向,这会影响响应速度。
  • 若请求的文件带有后缀名如 /douyin/a.x 则可能对SEO有负面影响,因为搜索引擎不确定该文件是否有安全风险。
  • 如果请求的确确实实是一个文件,那么从语义上来说,就不应该在末尾加上斜线。 所以加不加斜线完全取决于个人或团队的偏好,只要在整个项目的所有URI中做到一致,不会引起误会就好。个人觉得不加斜线,看起来更简洁。