#1206·buffalo

无论 `app.ServeFiles` 定义在何时何处,总是应该最后访问它

作者: byungjikroh创建于 2018年8月2日更新于 2022年9月29日
标签help wantedproposal

Steps to Reproduce the Problem

I added nested routes without groups' names like categories and products. actions/app.go

...
cr := &CategoriesResource{}
...
pr := &ProductsResource{}
a.GET("/{category_name}", pr.List)
a.GET("/{category_name}/{product_name}", pr.Show)
...
app.ServeFiles("/", assetsBox)

actions/render.go

var assetsBox = packr.NewBox("../public")

Then, I wanted to serve 'robots.txt' files in public directory but server even couldn't serve assets files in 'public/assets' directory because it tried to fetch a category record named 'robots.txt' or 'assets' which are placed at 'category name' of routes. So I reverted 'app.go' and 'render.go' like under Buffalo v0.12.4 (which supports public folder's files like robots.txt) and render with plain on products' List action. actions/app.go

app.ServeFiles("/assets", assetsBox)
...
cr := &CategoriesResource{}
...
pr := &ProductsResource{}
a.GET("/{category_name}", pr.List)
a.GET("/{category_name}/{product_name}", pr.Show)
...

actions/render.go

var assetsBox = packr.NewBox("../public/assets")

actions/products.go

func (v ProductsResource) List(c buffalo.Context) error {
  if c.Param("category_name") == "robots.txt" {
    return c.Render(200, r.Plain("robots.txt"))
  }
  ...
}

Expected Behavior

Expect the server to serve files on public directory like robots.txt or ads.txt properly even without groups on routes. So I want a feature to pre-define public directory files to serve files before matching routes params. Elixir web framework Phoenix did it like below.

# Serve at "/" the static files from "priv/static" directory.
#
# You should set gzip to true if you are running phoenix.digest
# when deploying your static files in production.
plug Plug.Static,
  at: "/", from: :example, gzip: false,
  only: ~w(css fonts images js icons favicon.ico robots.txt ads.txt sitemaps)

Actual Behavior

The server can't distinguish static files on public directory and routes params.

Info

### Buffalo Version v0.12.4 ### App Information Pwd=C:\Users\byungjik\go\src\example Root=C:\Users\byungjik\go\src\example GoPath=C:\Users\byungjik\go Name=example Bin=bin\example.exe PackagePkg=example ActionsPkg=example/actions ModelsPkg=example/models GriftsPkg=example/grifts VCS=git WithPop=true WithSQLite=false WithDep=false WithWebpack=true WithYarn=true WithDocker=true WithGrifts=true ### Go Version go version go1.9.1 windows/amd64 ### Go Env set GOARCH=amd64 set GOBIN= set GOEXE=.exe set GOHOSTARCH=amd64 set GOHOSTOS=windows set GOOS=windows set GOPATH=C:\Users\byungjik\go set GORACE= set GOROOT=C:\Go set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64 set GCCGO=gccgo set CC=gcc set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 set CXX=g++ set CGO_ENABLED=1 set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS= set CGO_CXXFLAGS=-g -O2 set CGO_FFLAGS=-g -O2 set CGO_LDFLAGS=-g -O2 set PKG_CONFIG=pkg-config ### Node Version v8.11.3 ### NPM …

内容来源: gobuffalo/buffalo