Por que eu preciso usar o http.StripPrefix para acessar meus arquivos estáticos?

main.go

package main import ( "net/http" ) func main() { http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static")))) http.ListenAndServe(":8080", nil) } 

Estrutura de diretórios:

 %GOPATH%/src/project_name/main.go %GOPATH%/src/project_name/static/..files and folders .. 

Mesmo depois de ler a documentação, tenho dificuldade em entender o que exatamente o http.StripPrefix faz aqui.

1) Por que não consigo acessar o localhost:8080/static se eu remover o http.StripPrefix ?

2) Qual URL mapeia para a pasta /static se eu remover essa function?

http.StripPrefix() encaminha a manipulação da solicitação para uma que você especifica como seu parâmetro, mas antes disso ela modifica a URL da solicitação retirando o prefixo especificado.

Por exemplo, no seu caso, se o navegador (ou um cliente HTTP) solicitar o recurso:

 /static/example.txt 

StripPrefix cortará o /static/ e encaminhará a solicitação modificada para o manipulador retornado pelo http.FileServer() para que ele veja que o recurso solicitado é

 /example.txt 

O Handler retornado pelo http.FileServer() procurará e servirá o conteúdo de um arquivo relativo à pasta (ou melhor, FileSystem ) especificado como seu parâmetro (você especificou "static" para ser a raiz de arquivos estáticos).

Agora, já que "example.txt" está na pasta static , você precisa especificar um caminho relativo para obter o caminho do arquivo correto.

Outro exemplo

Este exemplo pode ser encontrado na página de documentação do pacote http ( aqui ):

 // 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")))) 

Explicação:

FileServer() é informado que a raiz dos arquivos estáticos é "/tmp" . Queremos que o URL comece com "/tmpfiles/" . Portanto, se alguém solicitar "/tempfiles/example.txt" , queremos que o servidor envie o arquivo "/tmp/example.txt" .

Para conseguir isso, temos que retirar "/tmpfiles" da URL, e o restante será o caminho relativo comparado com a pasta raiz "/tmp" que se juntarmos, dá:

 /tmp/example.txt 

Assuma isso

Eu tenho um arquivo

 /home/go/src/js/kor.js 

Em seguida, diga ao fileserve que serve o diretório local

 fs := http.FileServer(http.Dir("/home/go/src/js")) 

Exemplo 1 – URL raiz para a raiz do Filerserver

Agora, o servidor de arquivos recebe a solicitação "/" como "/home/go/src/js"+"/"

 http.Handle("/", fs) 

Sim, a solicitação http://localhost/kor.js informa ao Fileserver, localize kor.js em

 "/home/go/src/js" + "/" + "kor.js". 

nós temos o arquivo kor.js

Example2 – url personalizado para raiz do servidor

Mas, se adicionarmos o nome da pesquisa adicional.

 http.Handle("/static/", fs) 

Agora o servidor de arquivos recebe "/static/" como "/home/go/src/js"+"/static/"

Sim, a solicitação http://localhost/static/kor.js informa ao Fileserver, localize kor.js em

 "/home/go/src/js" + "/static/" + "kor.js". 

Nós temos erro 404.

Exemplo 3 – url personalizado para a raiz do servidor com

então, nós modificamos o url de requisição antes que o Fileserver o leve com http.StripPrefix("/tmpfiles/", ...

depois de stripPrefix Fileserver tomar / vez disso /static/

 "/home/go/src/js" + "/" + "kor.js". 

tem kor.js

Eu responderei as duas perguntas uma por uma.

Responda 1 à pergunta 1: Se seu código está escrito como abaixo:

 http.Handle("/static/", http.FileServer(http.Dir("static")) 

sua pasta raiz é %GOPATH%/src/project_name/static/ . Quando você acessar localhost:8080/static , a URL /static será encaminhada para o manipulador retornado por http.FileServer () . No entanto, você não possui nenhum diretório ou arquivo denominado static na pasta raiz.

Answer 2 to Question 2 : Em geral, você não pode acessar a pasta /static se remover o http.StripPrefix () . No entanto, se você tiver um diretório ou arquivo denominado static , poderá acessá-lo ( não exatamente o diretório raiz desejado ) com a URL localhost:8080:/static .

A propósito, você não pode acessar nada se o seu URL não começar com /static , porque o http.ServeMux não redirectá sua solicitação.

Intereting Posts