Зачем мне нужно использовать 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
, если я удалю эту функцию?
Ответы
Ответ 1
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 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
Ответ 2
Я отвечу на два вопроса один за другим.
Ответ 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
не перенаправляет ваш запрос.
Ответ 3
Предположим, что
У меня есть файл
/home/go/src/js/kor.js
Затем скажите, что файлerve обслуживает локальный каталог
fs := http.FileServer(http.Dir("/home/go/src/js"))
Пример 1 - корневой URL для корня Filerserver
Теперь файловый сервер принимает "/"
запрос как "/home/go/src/js"+"/"
http.Handle("/", fs)
Да, http://localhost/kor.js
запрос сообщает файловому серверу, найдите kor.js
в
"/home/go/src/js" + "/" + "kor.js".
мы получили файл kor.js
.
Пример2 - настраиваемый URL-адрес в корневом каталоге Fileserver
Но, если мы добавим дополнительное имя resquest.
http.Handle("/static/", fs)
Теперь файловый сервер принимает "/static/"
запрос как "/home/go/src/js"+"/static/"
Да, http://localhost/static/kor.js
запрос сообщает файловому серверу, найдите 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