【问题标题】:How do I get Go's net/http package to stop removing double slashes?如何让 Go 的 net/http 包停止删除双斜杠?
【发布时间】: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//bDefaultServerMux,这是默认的 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() 函数,我们对路径进行操作,就好像它是一个文件路径一样。例如,如果您访问/../,它会将您重定向到/
  • 编写自己的多路复用器(又名路由器)或查找不清理路径的第三方多路复用器。

标签: http go


【解决方案1】:

使用 gorilla mux 使用 url 路由服务器。默认情况下,DefaultSeveMux 使用 Clean 来针对各种不需要的字符修改 url。这就是您使用// 双斜杠时网址发生变化的原因。

func Clean(path string) string

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

func (r *Router) SkipClean(value bool) *Router {
    r.skipClean = value
    return r
}

SkipClean()的gorilla mux文档中提到:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2016-08-07
    相关资源
    最近更新 更多