在某些情况下,通常的做法是将普通 URI 作为路径的后缀而不是查询参数传递。这是 Internet Archive 的 Wayback Machine 中的一个示例。https://web.archive.org/web/20150825082012/http://example.com/在此示例中,用户正在请求在http://example.com/捕获的副本2015-08-25 08:20:12。如果我们要在 Go 中实现类似的服务,我们可能会有一个如下的路由器:http.HandleFunc("/web/", returnArchivedCopy)然后在returnArchivedCopy处理函数中,我们将拆分r.URL.Path(r请求对象在哪里)以提取日期时间和目标 URL。但是这种风格的 URL 方案存在一个问题;Go 的 net/http 包cleanPath在路径部分调用函数来清理它。此清理过程执行各种清理任务,例如从路径中消除.和删除..多个斜杠并将多个斜杠替换为单个斜杠。当 Unix 系统//中的文件路径与/. 然而,这会导致上述用例中http://example出现问题http:/example,并且服务器在内部将重定向响应返回给具有清理路径的客户端。我想知道,在这种情况下我有什么选择?有没有办法让 HTTP 不清理请求路径,同时仍然利用默认(或稍微修改过的)服务器、多路复用器和处理程序附带的所有默认行为?或者有没有办法在它遇到多路复用器的路由模式之前修改请求参数(在这种情况下是路径)。如果后者是可能的,我们可能会尝试执行类似 URL 编码的操作以避免重定向,然后在提取所需位之前在处理程序函数中将 URL 解码回。我已经尝试了一些自定义处理程序和多路复用器,但我是 Go 的新手,因此我不太确定如何在更改请求后将路由委托回默认处理程序。
1 回答
- 1 回答
- 0 关注
- 165 浏览
添加回答
举报
0/150
提交
取消