gorilla mux, исключая запрос по расширению

Попытка настроить маршрутизацию сервера go с github.com/gorilla/mux для ответа на все запросы с index.html, но исключить запросы с расширением .jpg|.js|.png

Статические файлы, исключенные из-за расширения, будут перенаправлены на FileServer. настроен.

Неудачная попытка

  func main() {
        r := mux.NewRouter()

        r.HandleFunc("/{path:^.*([!js|jpg|png|gif])$}", func(w http.ResponseWriter, r *http.Request) {
            http.ServeFile(w, r, "dist/index.html")
        })

        r.PathPrefix("/").Handler(http.StripPrefix("/", http.FileServer(http.Dir("dist"))))

        http.Handle("/", r)
        http.ListenAndServe(":8000", nil)
    }

person iswak    schedule 28.01.2017    source источник


Ответы (2)


Приветствуется лучший подход, надеялся использовать регулярное выражение, чтобы вещи оставались нетронутыми без сумасшедших условий if/else

func main() {
    r := mux.NewRouter()

    r.HandleFunc("/{path:.*}", func(w http.ResponseWriter, r *http.Request) {
        if HasSuffix(r.URL.Path, []string{"js", "css", "gif", "jpeg", "woff2", "woff", "ttf"}) == false {
            fmt.Println("serving index")
            http.ServeFile(w, r, "dist/index.html")
        } else {
            http.ServeFile(w, r, "dist/"+r.URL.Path)
        }
    })

    //r.PathPrefix("/").Handler(http.StripPrefix("/", http.FileServer(http.Dir("dist"))))

    http.Handle("/", r)
    http.ListenAndServe(":8000", nil)
}

//HasSuffix check if url has suffix
func HasSuffix(path string, parts []string) bool {
    for _, part := range parts {
        fmt.Println("checking if part:" + part + " exists in path:" + path)
        if strings.HasSuffix(path, part) == true {
            return true
        }
    }
    return false
}
person iswak    schedule 28.01.2017

Это "^.*([!js|jpg|png|gif])$}" не является допустимым регулярным выражением для сопоставления строки, которая не имеет .jpg|.js|.png

Однако в golang негативный просмотр вперед не поддерживается по техническим причинам, в частности потому, что он противоречит гарантиям O(n)-времени библиотеки.

Я бы предложил вам сделать это наоборот, то есть добавить обработчики для файлов png, js, css и т. д., чтобы обслуживать файлы как таковые.

person Sarath Sadasivan Pillai    schedule 28.01.2017