【问题标题】:Expected root files and custom 404 with Golang Mux Router and http.FileServer使用 Golang Mux 路由器和 http.FileServer 的预期根文件和自定义 404
【发布时间】:2019-02-24 18:38:50
【问题描述】:

我正在使用 Go 构建一个小型网站,但遇到了自定义 404 页面的问题。这是我当前的路由器代码:

r := mux.NewRouter()

// Page routing
r.HandleFunc("/", homeHandler).Methods("GET")
r.HandleFunc("/example1", exampleOneHandler).Methods("GET")
r.HandleFunc("/example2", exampleTwoHandler).Methods("GET", "POST")

// Other paths for static assets omitted

// Psuedo-root directory for icon files, etc.
r.PathPrefix("/").Handler(http.FileServer(http.Dir("public")))

// 404 Page
r.NotFoundHandler = http.HandlerFunc(notFoundHandler)

log.Fatal(http.ListenAndServe(":1234", r))

因此,如果没有第 11 行的 PathPrefix 定义,notFoundHandler 会按预期命中并返回自定义 404 HTML。

但是,现在我添加了该路径定义以适应根目录标准,例如 favicon.ico、robots.txt、应用程序图标等,并且可以按预期工作。然而,作为副作用,任何与 /example1 或 /example2 不匹配的东西,比如 /example3,都会通过 http.FileServer 在伪根目录中查找名为“example3”的文件。没有找到后,FileServer 直接写入 http.ResponseWriter 并以“404 not found”,完全绕过 mux 的 NotFoundHandler。

我能看到的唯一可行的解​​决方案是为每个文件添加一个明确的路由,但这似乎是一个相当残酷的解决方案。有没有更优雅的方法来解决我缺少的这个问题?

【问题讨论】:

    标签: go routing http-status-code-404 mux


    【解决方案1】:

    notFoundHandler 为没有注册处理程序的路径激活。而且由于您将处理程序(文件服务器)注册到路径"/",它将始终匹配所有请求,因此将不再调用未找到的处理程序。

    要避免这种情况,最简单的方法是手动注册所有必须位于根目录的文件(这些文件并不多,或者至少不应该有)。如果您有一堆其他的非标准静态文件,请将它们发布到类似/static/ 的路径下,这样未注册的路径(例如/example3)将触发未找到的处理程序。

    另一种解决方案是将文件服务器保留在路径 "/",但将其包装起来,如果它会返回 404 状态代码,请调用您自己的 notFoundHandler 以提供自定义错误页面。与我之前的建议相比,这更复杂,所以我还是会选择那个。

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 2014-02-09
      • 2014-03-07
      • 2014-09-08
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 2015-04-18
      相关资源
      最近更新 更多