Почему мне нужно использовать http.StripPrefix для доступа к моим статическим файлам?
main.go
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
http.ListenAndServe(":8080", nil)
}
Структура каталогов:
%GOPATH%/src/project_name/main.go
%GOPATH%/src/project_name/static/..files and folders ..
Даже после прочтения документации у меня возникают проблемы с пониманием того, что именно http.StripPrefix
здесь
1) Почему я не могу получить доступ localhost:8080/static
если я удалю http.StripPrefix
?
2) Какой URL отображается на /static
папку, если я удалю эту функцию?
3 ответа
http.StripPrefix()
перенаправляет обработку запроса на тот, который вы указали в качестве его параметра, но перед этим он изменяет URL-адрес запроса, удаляя указанный префикс.
Так, например, в вашем случае, если браузер (или HTTP-клиент) запрашивает ресурс:
/static/example.txt
StripPrefix
будет резать /static/
и перешлите измененный запрос обработчику, возвращенному http.FileServer()
поэтому он увидит, что запрошенный ресурс
/example.txt
Handler
вернулся http.FileServer()
будет искать и обслуживать содержимое файла относительно папки (или, скорее, FileSystem
) указан в качестве параметра (вы указали "static"
быть корнем статических файлов).
Сейчас с "example.txt"
находится в static
папку, вы должны указать относительный путь к нему, чтобы получить путь к другому файлу.
Другой пример
Этот пример можно найти на странице документации пакета http ( здесь):
// To serve a directory on disk (/tmp) under an alternate URL
// path (/tmpfiles/), use StripPrefix to modify the request
// URL's path before the FileServer sees it:
http.Handle("/tmpfiles/",
http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
Объяснение:
FileServer()
сказано, что корень статических файлов "/tmp"
, Мы хотим, чтобы URL начинался с "/tmpfiles/"
, Так что если кто-то просит "/tempfiles/example.txt"
, мы хотим, чтобы сервер отправил файл "/tmp/example.txt"
,
Чтобы достичь этого, мы должны раздеть "/tmpfiles"
от URL, а оставшийся будет относительным путем по сравнению с корневой папкой "/tmp"
который, если мы присоединяемся, дает:
/tmp/example.txt
Предположим, что
У меня есть файл
/home/go/src/js/kor.js
Затем скажите, что fileserve обслуживает локальный каталог
fs := http.FileServer(http.Dir("/home/go/src/js"))
Пример 1 - корневой URL для корневого файла Filerserver
Теперь файловый сервер занимает "/"
запрос как "/home/go/src/js"+"/"
http.Handle("/", fs)
Да, http://localhost/kor.js
запрос говорит Fileserver, найти kor.js
в
"/home/go/src/js" + "/" + "kor.js".
у нас есть kor.js
файл.
Пример 2 - пользовательский URL-адрес для корневого файла сервера
Но, если мы добавим дополнительное имя запроса.
http.Handle("/static/", fs)
Теперь файловый сервер занимает "/static/"
запрос как "/home/go/src/js"+"/static/"
Да, http://localhost/static/kor.js
запрос говорит Fileserver, найти kor.js
в
"/home/go/src/js" + "/static/" + "kor.js".
Мы получили ошибку 404.
Пример 3 - пользовательский URL для корня Fileserver с
поэтому мы модифицируем URL запроса, прежде чем Fileserver получит его http.StripPrefix("/tmpfiles/", ...
после stripPrefix
Fileserver взять /
вместо /static/
"/home/go/src/js" + "/" + "kor.js".
получил kor.js
Я отвечу на два вопроса один за другим.
Ответ 1 на вопрос 1: Если ваш код написан так, как показано ниже:
http.Handle("/static/", http.FileServer(http.Dir("static"))
ваша корневая папка %GOPATH%/src/project_name/static/
, Когда вы получаете доступ localhost:8080/static
URL /static
будет перенаправлен обработчику, возвращенному функцией http.FileServer (). Тем не менее, у вас нет каталога или файла с именем static
в корневой папке.
Ответ 2 на Вопрос 2: В общем, вы не можете получить доступ /static
папку, если вы удалите http.StripPrefix (). Тем не менее, если у вас есть каталог или файл с именем static
, вы можете получить к нему доступ (точно не корневой каталог, который вы хотите) с помощью URL localhost:8080:/static
,
Кстати, вы не можете получить доступ к чему-либо, если ваш URL не начинается с /static
, поскольку http.ServeMux
не будет перенаправлять ваш запрос.
Для тех, у кого есть проблемы с подкаталогами, вам нужно добавить "."
потому что кажется, что путь рассматривается как относительный, только если это папка в корневом каталоге двоичного файла.
Например
s.router.PathPrefix("/logos/").Handler(
http.StripPrefix("/logos/", http.FileServer(http.Dir("./uploads/logos/"))))
Обратите внимание "."
перед "/uploads
"