gpt4 book ai didi

reactjs - 如何使用 Go 提供动态创建的 URL 路径?

转载 作者:数据小太阳 更新时间:2023-10-29 03:04:29 25 4
gpt4 key购买 nike

我正在使用 react-router 和 browserHistory reactjs 项目中的 pushState。该项目允许用户创建一个创建新路径的注释。为了提供这种类型的网站,除了静态内容之外,我还需要为每个路径提供相同的 HTML 文件。所以我的 nodejs 代码看起来像这样。

// Serve the static content
app.use('/static/css/', express.static(path.join(__dirname, '../../react-ui/build/static/css')));
app.use('/static/js/', express.static(path.join(__dirname, '../../react-ui/build/static/js')));
app.use('/static/media/', express.static(path.join(__dirname, '../../react-ui/build/static/media')));
app.use('/static/img/', express.static(path.join(__dirname, '../../react-ui/build/static/img')));
app.use('/img/', express.static(path.join(__dirname, '../../react-ui/build/img')));

// Serve the same HTML file to everything else
app.use('*', express.static(path.join(__dirname, '../../react-ui/build')));

我没有看到 Go FileServer 有任何通配符支持。目前,我使用与此类似的 Go 代码提供所有静态页面。

package main

import (
"net/http"
)

func init(){
fs := http.FileServer(http.Dir("web"))
http.Handle("/", fs)
http.Handle("/static-page-1/", http.StripPrefix("/static-page-1/", fs))
http.Handle("/static-page-2/", http.StripPrefix("/static-page-2/", fs))
http.Handle("/static-page-3/", http.StripPrefix("/static-page-3/", fs))
}

是否可以使用 Go 服务器将内容提供给动态生成的 URL 路径?

如果 Handle 方法支持变量,那么我会这样写代码

fs := http.FileServer(http.Dir("web"))
http.Handle("/static/", fs)
http.Handle("/{unknownUserPath}", http.StripPrefix("/{unknownUserPath}", fs))

{unknownUserPath} 可以是用户键入的不在/static/路径下的任何路径。

这是go项目结构

enter image description here

这是基于@putu 回答的服务器

package main

import (
"net/http"
"strings"
)

func adaptFileServer(fs http.Handler) http.Handler {
fn := func(w http.ResponseWriter, req *http.Request) {
staticIndex := strings.Index(req.URL.Path, "/static/");
imgIndex := strings.Index(req.URL.Path, "/img/");

if staticIndex == -1 && imgIndex == -1 {
fsHandler := http.StripPrefix(req.URL.Path, fs)
fsHandler.ServeHTTP(w, req)
} else {
fs.ServeHTTP(w, req)
}
}
return http.HandlerFunc(fn)
}

func init() {
fs := http.FileServer(http.Dir("web"))
http.Handle("/", adaptFileServer(fs))
}

最佳答案

如果您想将具有 URL 模式 /* 的静态内容提供给特定目录,请使用 jeevatkm 提供的答案。

如果您需要稍微自定义的版本,您需要一种适配器,将 URL 路径映射到静态文件处理程序 (http.FileServer)。示例代码如下所示:

package main

import (
"log"
"net/http"
"regexp"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello world!"))
}

func adaptFileServer(fs http.Handler, mux http.Handler) http.Handler {
fn := func(w http.ResponseWriter, req *http.Request) {
//Use your Path matcher here.
//For demonstration, REGEX match is used
//and it's probably not the most efficient.
staticRegex := regexp.MustCompile("^/static-page-[0-9]+/")
if matches := staticRegex.FindStringSubmatch(req.URL.Path); matches != nil {
log.Printf("Match: %v, %v", req.URL.Path, matches[0])
fsHandler := http.StripPrefix(matches[0], fs)
fsHandler.ServeHTTP(w, req)
} else if mux != nil {
log.Printf("Doesn't match, pass to other MUX: %v", req.URL.Path)
mux.ServeHTTP(w, req)
} else {
http.Error(w, "Page Not Found", http.StatusNotFound)
}
}
return http.HandlerFunc(fn)
}

func init() {
//Usual routing definition with MUX
mux := http.NewServeMux()
mux.HandleFunc("/hello", helloHandler)

//"Dynamic" static file server.
fs := http.FileServer(http.Dir("web"))
http.Handle("/", adaptFileServer(fs, mux))
}

func main() {
log.Fatal(http.ListenAndServe(":8080", nil))
}

在上面的适配器示例中,如果请求路径匹配特定的模式(在上面的示例中为/static-page-*/),它将被传递给http.文件服务器。如果不匹配,并且指定了多路复用器,它将调用 mux.ServeHTTP。否则会返回404错误。

如果您想要另一个匹配规则,只需更改 regex 模式(或使用您的自定义匹配器)。

注意:
请不要对 FileServermux 使用相同的处理程序实例。例如,当您调用 http.Handle 时,它会使用 http.DefaultServeMux 来处理路由。如果您将 http.DefaultServeMux 作为 adaptFileServer 的第二个参数传递,您可能会以无休止的递归结束。

关于reactjs - 如何使用 Go 提供动态创建的 URL 路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44867052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com