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

Другие вопросы по тегам