为了账号安全,请及时绑定邮箱和手机立即绑定

在 go mux 的子路径下提供 html、css、js 文件

在 go mux 的子路径下提供 html、css、js 文件

Go
白衣染霜花 2022-07-18 17:18:18
我想使用 go mux 在子路径(例如 http://localhost:3000/app/)下显示编译的 Angular 项目在没有子路径“app/”的情况下,它可以按预期工作但是当我使用 http.StripPrexix("/app/, ..) 处理程序添加子路径时,仅找到并呈现索引 html,但没有所有 css、js 文件。测试代码package mainimport (    "log"    "net/http"    "github.com/gorilla/mux")func main() {    mux := mux.NewRouter()    fs := http.FileServer(http.Dir("./static/"))    // Serve static files    mux.PathPrefix("/app/").Handler(http.StripPrefix("/app/", fs))    log.Println("Listening...")    http.ListenAndServe(":3000", mux)}索引.html<!doctype html><html><head>  <meta charset="utf-8">  <title>TestProject</title>  <base href="/">  <meta name="viewport" content="width=device-width, initial-scale=1">  <link rel="icon" type="image/x-icon" href="favicon.ico"><link rel="stylesheet" href="styles.3ff695c00d717f2d2a11.css"></head><body>  <h1>Should work</h1>  <app-root></app-root><script src="runtime.359d5ee4682f20e936e9.js" defer></script><script src="polyfills.bf99d438b005d57b2b31.js" defer></script><script src="main.5dd083c1a27b2a7e410a.js" defer></script></body></html>工作项目下载该项目还包括要服务的静态文件https://filehorst.de/d/dubJmmsz目标服务不同路径下的不同项目关注这个问题我究竟做错了什么?如何在 eg: localhost:3000/app/ 下为整个项目服务
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

gorilla mux 文档提到了如何处理 Angular SPA 应用程序。


但是,由于您希望将 SPA 根目录基于子目录,因此您还需要在 HTML/JS 中进行更改。基本目录应该是一个变量,与 SPA 的前缀相同。我相信这更像是一个设计问题


否则,由于除索引之外的其余文件都在根目录下解析,因此其余文件需要回退到“/”并且都已配置。


router.PathPrefix("/app").Handler(spa)

router.PathPrefix("/").Handler(spa)

所以尝试如下。我尝试了以下静态文件夹:


package main


import (

    "log"

    "net/http"

    "os"

    "path/filepath"

    "time"


    "github.com/gorilla/mux"

)


type spaHandler struct {

    staticPath string

    indexPath  string

}


func (h spaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

    // get the absolute path to prevent directory traversal

    path, err := filepath.Abs(r.URL.Path)

    if err != nil {

        // if we failed to get the absolute path respond with a 400 bad request

        // and stop

        http.Error(w, err.Error(), http.StatusBadRequest)

        return

    }


    // prepend the path with the path to the static directory

    path = filepath.Join(h.staticPath, path)


    // check whether a file exists at the given path

    _, err = os.Stat(path)

    if os.IsNotExist(err) {

        // file does not exist, serve index.html

        http.ServeFile(w, r, filepath.Join(h.staticPath, h.indexPath))

        return

    } else if err != nil {

        // if we got an error (that wasn't that the file doesn't exist) stating the

        // file, return a 500 internal server error and stop

        http.Error(w, err.Error(), http.StatusInternalServerError)

        return

    }


    // otherwise, use http.FileServer to serve the static dir

    http.FileServer(http.Dir(h.staticPath)).ServeHTTP(w, r)

}


func main() {

    router := mux.NewRouter()


    spa := spaHandler{staticPath: "static", indexPath: "index.html"}

    router.PathPrefix("/app").Handler(spa)


    srv := &http.Server{

        Handler: router,

        Addr:    ":3000",

        // Good practice: enforce timeouts for servers you create!

        WriteTimeout: 15 * time.Second,

        ReadTimeout:  15 * time.Second,

    }


    log.Fatal(srv.ListenAndServe())

}


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号