2015-05-05 7 views
2

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

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 для обработки запросов 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) 
} 

Я хочу, чтобы добавить обработчик для недействительных URLS, но он никогда не вызывается:

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) 
} 

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

+0

Какова структура вашего каталога? – MIkCode

+0

Добавлено на вопрос –

ответ

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 (как в those tests), использовать его для конкретного пути, а не для общего" /".

+0

Спасибо Фон, я тоже это подозревал. Мы хотим обслуживать страницу root index.html, поэтому ввод «http: // localhost: 8888» в браузере дает пользователю статический контент. Следовательно, r.PathPrefix ("/"). Обработчик(). Есть ли альтернатива «/», которая позволила бы 404 обрабатывать и обслуживать статический контент? –

+0

@CloomMagoo да, но побочный эффект заключается в том, что «NotFoundHandler» никогда не будет вызван. – VonC

+0

@CloomMagoo для "/", используйте 'mux.HandleFunc ("/", ...)', а не 'PathPrefix' – VonC