【发布时间】:2018-08-18 11:43:36
【问题描述】:
考虑以下非常基本的“net/http”程序:
package main
import (
"net/http"
"log"
)
func entry(w http.ResponseWriter, req *http.Request) {
log.Println(req.URL.Path)
path := []byte(req.URL.Path)
w.Write(path)
}
func main() {
http.HandleFunc("/", entry)
err := http.ListenAndServe("localhost:10000", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
访问 URL 时,http://localhost:10000/a//b,DefaultServerMux,这是默认的 HandleFunc() 和 ListenAndServe() 使用的,将其重定向到 /a/b,有效地删除了双斜杠。
documentation for ServerMux 确实指定它“清理” URL 请求:
ServeMux 还负责清理 URL 请求路径,重定向任何包含 .或 .. 元素或重复斜杠到等效的、更简洁的 URL。
但如果我不想要它怎么办?我的 URL 中有 // != / 的情况。我可以找到另一个解决方案。但是有没有办法仍然使用 Go 的“net/http”包,而它不会像这样清理我的 URL?最好尽可能少地重写。
(我可能会找到与 // 和 / 不同的解决方案,因为我可能对 ServerMux 提供的其他功能感到满意(如果解决方案需要我使用另一个多路复用器),但是现在我很好奇Go的标准“net/http”包是否有解决方案。)
【问题讨论】:
-
我不这么认为,如果使用
//斜杠确实是一个好网址。 -
它真的不应该那样做,除了
http.FileServer(因为当操作系统解析文件路径时//等同于/)。根据 RFC 3986,具有空段的路径完全有效。 -
@MichaelHampton 如果@Himanshu 的回答是准确的,它似乎使用了路径的
Clean()函数,我们对路径进行操作,就好像它是一个文件路径一样。例如,如果您访问/../,它会将您重定向到/。 -
编写自己的多路复用器(又名路由器)或查找不清理路径的第三方多路复用器。