Обслуживание статического контента и обработка 404 не найдено с помощью инструментария Gorilla

Недавно я спрашивал об обслуживании статического контента и обработке 404 с помощью мультиплексора Gorilla; при использовании Handle вместо PathPrefix приложение может обслуживать корневую страницу (http://localhost:8888):

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/myService", ServiceHandler)
    r.Handle("/", http.FileServer(http.Dir("./static")))
    r.NotFoundHandler = http.HandlerFunc(notFound)
    l, _ := net.Listen("tcp", "8888")
    http.Serve(l, r)
}

Однако запросы страниц внутри корневой страницы (например, http://localhost:8888/demo/page1.html) перехватывается обработчиком ошибки 404. Есть ли способ предотвратить это, при этом отлавливая запросы на несуществующие страницы или сервисы? Это структура каталогов:

...
main.go
static\
  | index.html
  demo\
    page1.html
    demo.js
    demo.css
    | jquery\
       | <js files>
    | images\
       | <png files>

Предыдущий вопрос:

Я использую набор инструментов Gorilla mux для обработки http-запросов в приложении веб-сервера:

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/myService", ServiceHandler)
    r.PathPrefix("/").Handler(http.FileServer(http.Dir("./static")))
    l, _ := net.Listen("tcp", "8888")
    http.Serve(l, r)
}

Я хочу добавить обработчик недопустимых URL-адресов, но он никогда не вызывается:

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/myService", ServiceHandler)
    r.NotFoundHandler = http.HandlerFunc(notFound)
    r.PathPrefix("/").Handler(http.FileServer(http.Dir("static")))
    l, _ := net.Listen("tcp", "8888")
    http.Serve(l, r)
}

Если я удаляю статический обработчик, вызывается ненайденный обработчик. Однако приложение должно обслуживать статический контент по не абсолютному пути. Есть ли способ совместить это с обработкой 404?


person Cloom Magoo    schedule 05.05.2015    source источник
comment
Какова ваша структура каталогов?   -  person MIkCode    schedule 05.05.2015
comment
Добавлено к вопросу   -  person Cloom Magoo    schedule 05.05.2015


Ответы (1)


Я подозреваю, что r.PathPrefix("/").Handler() будет соответствовать любому пути, что сделает обработчик notfound бесполезным.

Как указано в "route.go":

// Note that it does not treat slashes specially 
// ("`/foobar/`" will be matched by the prefix "`/foo`") 
// so you may want to use a trailing slash here.

Если вы используете PathPrefix (как в тех тестов), используйте это для определенного пути, а не для общего "/".

person VonC    schedule 05.05.2015
comment
Спасибо Вон, я тоже это подозревал. Мы хотим обслуживать корневую страницу index.html, поэтому ввод в браузере localhost:8888 дает пользователю статическое содержимое. Следовательно, r.PathPrefix(/).Handler(). Есть ли альтернатива /, которая позволила бы обрабатывать и обслуживать статический контент с ошибкой 404? - person Cloom Magoo; 05.05.2015
comment
@CloomMagoo да, но побочным эффектом является то, что NotFoundHandler никогда не будет вызываться. - person VonC; 05.05.2015
comment
@CloomMagoo для / используйте mux.HandleFunc("/", ...), а не PathPrefix - person VonC; 05.05.2015
comment
использовать HandleFunc вместо PathPrefix, как будет выглядеть фактическая функция обработчика для обслуживания статического каталога? Я буду исследовать, но если у вас есть пример, я был бы признателен. Спасибо. - person Cloom Magoo; 05.05.2015
comment
@CloomMagoo, как и любая другая функция httpHandler. - person VonC; 05.05.2015
comment
mux.Handle(/, http.FileServer(http.Dir(staticPath))) работает, спасибо. Теперь запросы на страницы со статическим содержимым (/content/page1) перехватываются NotFoundHandler. Все-таки прогресс. - person Cloom Magoo; 06.05.2015