如何获取Go的net / http包以停止删除双斜杠?

时间:2018-08-18 11:43:37

标签: http go

考虑以下非常基本的“ 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(默认DefaultServerMuxHandleFunc()使用的ListenAndServe())将其重定向到/a/b,从而有效地删除了双斜线。

documentation for ServerMux确实指定了它“清理” URL请求:

  

ServeMux还负责清理URL请求路径,重定向任何包含的请求。或..元素或重复的斜线表示为等效的,简洁的URL。

但是,如果我不想这么做怎么办?我遇到一种情况,其中URL中的//!= /。我可以找到另一个解决方案。但是有没有办法不使用Go的“ net / http”软件包,而又不清理我的URL?最好尽量减少重写。

(我可能会找到与///截然不同的解决方案,因为我可能会对ServerMux提供的其他功能感到满意(如果解决方案要求我使用另一个多路复用器),但是现在我很好奇Go的标准“ net / http”包是否有解决方案。)

1 个答案:

答案 0 :(得分:1)

让大猩猩多路复用器使用URL路由服务器。默认情况下,http://subdomain.mysite.com/user/edit/1 使用Clean来针对各种不需要的字符修改网址。这就是当您使用DefaultSeveMux双斜杠时URL更改的原因。

//

如果您不想清理URL。 Gorilla mux提供了SkipClean()方法,该方法设置为true时。它不会清除网址。

func Clean(path string) string

在大猩猩mux的文档中,func (r *Router) SkipClean(value bool) *Router { r.skipClean = value return r } 提到:

  

SkipClean定义新路线的路径清洗行为。的   初始值为假。用户应注意哪些路线是   未清除如果为true,则路由路径为“ / path // to”时,它将   保持双斜线。如果您有路线,这会很有帮助   例如:/ fetch / http://xkcd.com/534/为false时,路径为   已清理,因此/ fetch / http://xkcd.com/534/将变为   /fetch/http/xkcd.com/534