Ответ 1
Возможно, использование custom http.HandlerFunc
будет проще:
За исключением вашего случая, ваша функция будет http.ServeFile
one, для обслуживания всего одного файла.
См. например: Перейти к веб-приложениям: обслуживание статических файлов":
Добавьте ниже приведенный ниже ваш домашний обработчик(см. ниже):
http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, r.URL.Path[1:])
})
Это использует функцию
net/http
ServeFile для обслуживания нашего контента.
Эффективно все, что делает запрос, начинающийся с пути/static/
, будет обрабатываться этой функцией.
Одна вещь, которую я обнаружил, что я должен был сделать, чтобы запрос обрабатывался правильно, обрезал ведущий '/using:
r.URL.Path[1:]
Собственно, не делай этого. Это невозможно в Go 1.6, поскольку sztanpet комментарии, с commit 9b67a5d:
Если предоставленное имя файла или каталога является относительным путем, это интерпретируется относительно текущего каталога и может восходить к родительскому каталоги.
Если предоставленное имя создано из пользовательского ввода, его следует очистить до вызоваServeFile
.
В качестве меры предосторожностиServeFile
отклонит запросы, в которыхr.URL.Path
содержит элемент пути "..
".
Это защитит от следующего "url":
/../file
/..
/../
/../foo
/..\\foo
/file/a
/file/a..
/file/a/..
/file/a\\..