当前位置: 首页 > 面试题库 >

多个目录服务不起作用

宋明亮
2023-03-14
问题内容

下面的代码有任何错误吗?以下代码无法提供多个目录服务。当我访问localhost:9090 / ide时,服务器将返回404错误。

package main

import (
    "log"
    "net/http"
)

func serveIDE(w http.ResponseWriter, r *http.Request) {
    http.FileServer(http.Dir("/home/user/ide")).ServeHTTP(w, r)
}

func serveConsole(w http.ResponseWriter, r *http.Request) {
    http.FileServer(http.Dir("/home/user/console")).ServeHTTP(w, r)
}

func main() {
    http.HandleFunc("/ide", serveIDE)         
    http.HandleFunc("/console", serveConsole) 
    err := http.ListenAndServe(":9090", nil)  
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

当我这样更改代码时,

http.HandleFunc("/", serveIDE)

它会按我预期的那样工作。


问题答案:

使用中的问题之一http.FileServer是请求路径用于构建文件名,因此,如果要从根目录以外的任何地方提供服务,则需要剥离到该处理程序的路由前缀。

标准库为此提供了一个有用的工具http.StripPrefix,但该工具只能在http.Handlers上使用,而不能在s
http.HandleFunc上使用,因此要使用它,您需要使您适应HandleFunca Handler

这是一个应该执行您想要的工作版本。请注意,wHandler只是从HttpFunc方法到Hander接口的适配器:

package main

import (
        "log"
        "net/http"
)

func serveIDE(w http.ResponseWriter, r *http.Request) {
        http.FileServer(http.Dir("/home/user/ide")).ServeHTTP(w, r)
}

func serveConsole(w http.ResponseWriter, r *http.Request) {
        http.FileServer(http.Dir("/home/user/console")).ServeHTTP(w, r)
}

type wHandler struct {
        fn http.HandlerFunc
}

func (h *wHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        log.Printf("Handle request: %s %s", r.Method, r.RequestURI)
        defer log.Printf("Done with request: %s %s", r.Method, r.RequestURI)
        h.fn(w, r)
}

func main() {
        http.Handle("/ide", http.StripPrefix("/ide", &wHandler{fn: serveIDE}))
        http.Handle("/console", http.StripPrefix("/console", &wHandler{fn: serveConsole}))
        err := http.ListenAndServe(":9090", nil)
        if err != nil {
                log.Fatal("ListenAndServe: ", err)
        }
}


 类似资料:
  • 我正试图用服务栈实现Swagger。我已经用nuget安装了带有swagger的服务栈。当前的DLL版本大多报告为3.9.56.0。 我正在努力遵循…https://github.com/ServiceStack/ServiceStack.UseCases/tree/master/SwaggerHelloWorld提供的例子 这个指令看起来相当简单... 在我通过nuget安装后(按照文档说明),

  • 拉威尔6。PHP7.4。 我正在建立一个网站。因为Laravel提供了默认的身份验证登录和注册表单。我将登录表单放入导航中,而注册页面上的注册表单。现在我想让用户在注册页面上提供另一个登录表单。 我设计了另一个登录表单,在提交时,我将其引用到相同的登录路径,但它不起作用。错误是419页已过期。 我也读过关于MutiAuth的文章,但这是我将在我的管理面板上使用的东西。有什么解决办法吗? Regis

  • 我正在另一台计算机上安装Wamp服务器,以运行一个中型数据库和用户界面。我已经成功拦截了IIS,并将服务器路由到Localhost:8080。但是每当我试图从本地主机主页访问我的项目时,在www文件中;我被重定向到一个页面没有找到错误。 当我将鼠标悬停在链接上方时,目录总是出现“http:// ProjectFolderNameHere /”。当它应该是“http:// LocalHost:808

  • 问题内容: 根据Flask自述文件,可以在以下位置访问蓝图静态文件blueprintname/static。但是由于某种原因,它不起作用。 我的蓝图是这样的: : :我的javascript 在Flask应用中注册的蓝图(路由工作及所有内容) 当我转到时,它只会显示404。 当我按照Flask自述文件获取静态文件时: 输出是 这也不起作用。我的根app/static/文件夹中没有任何内容。 我无法

  • 我想列出我的picasa专辑中的所有专辑列表。这是代码。 但例外正在发生: 请帮忙。

  • 我在我的本地应用程序中创建目录。它在Android5.0中工作得很好,但在Android6.0中(Marshmallow)有些时候它工作了,有些时候不工作。我使用下面的代码来创建新的目录。我在目录中保存视频和图像文件。