Зачем мне нужно использовать 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