http - with - web application golang
¿Por qué necesito usar http.StripPrefix para acceder a mis archivos estáticos? (3)
Asumir que
Tengo un archivo
/home/go/src/js/kor.js
Luego, dile a fileserve sirve directorio local
fs := http.FileServer(http.Dir("/home/go/src/js"))
Ejemplo 1: URL de raíz a raíz de Filerserver
Ahora el servidor de archivos toma la solicitud
"/"
como
"/home/go/src/js"+"/"
http.Handle("/", fs)
Sí, la solicitud
http://localhost/kor.js
le dice a Fileserver, busque
kor.js
en
"/home/go/src/js" + "/" + "kor.js".
Tenemos el archivo
kor.js
Ejemplo2: URL personalizada para la raíz del servidor de archivos
Pero, si agregamos un nombre de solicitud adicional.
http.Handle("/static/", fs)
Ahora el servidor de archivos toma
"/static/"
solicitud
"/static/"
como
"/home/go/src/js"+"/static/"
Sí, la solicitud
http://localhost/static/kor.js
le dice a Fileserver, busque
kor.js
en
"/home/go/src/js" + "/static/" + "kor.js".
Tenemos un error 404.
Ejemplo 3: URL personalizada para la raíz del servidor de archivos con
entonces, modificamos la URL de solicitud antes de que Fileserver la tome con
http.StripPrefix("/tmpfiles/", ...
después de
stripPrefix
Fileserver tomar
/
lugar de
/static/
"/home/go/src/js" + "/" + "kor.js".
tengo
kor.js
main.go
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
http.ListenAndServe(":8080", nil)
}
Estructura de directorios:
%GOPATH%/src/project_name/main.go
%GOPATH%/src/project_name/static/..files and folders ..
Incluso después de leer la documentación, tengo problemas para comprender qué hace exactamente
http.StripPrefix
aquí.
1) ¿Por qué no puedo acceder a
localhost:8080/static
si
http.StripPrefix
?
2) ¿Qué URL se asigna a
/static
carpeta
/static
si elimino esa función?
Contestaré las dos preguntas una por una.
Respuesta 1 a la pregunta 1: si su código está escrito a continuación:
http.Handle("/static/", http.FileServer(http.Dir("static"))
su carpeta raíz es
%GOPATH%/src/project_name/static/
.
Cuando accede a
localhost:8080/static
, la URL
/static
se reenviará al controlador devuelto por
http.FileServer()
.
Sin embargo, no tiene un directorio o archivo llamado
static
en la carpeta raíz.
Respuesta 2 a la pregunta 2
: en general, no puede acceder a
/static
carpeta
/static
si elimina
http.StripPrefix()
.
Sin embargo, si tiene un directorio o archivo llamado
static
, puede acceder a él (
exactamente no al directorio raíz que desea
) con la URL
localhost:8080:/static
.
Por cierto, no puede acceder a nada si su URL no comienza con
/static
, porque
http.ServeMux
no redirigirá su solicitud.
http.StripPrefix()
reenvía el manejo de la solicitud a una que especifique como parámetro, pero antes de eso modifica la URL de la solicitud quitando el prefijo especificado.
Entonces, por ejemplo, en su caso, si el navegador (o un cliente HTTP) solicita el recurso:
/static/example.txt
StripPrefix
cortará
/static/
y reenviará la solicitud modificada al controlador devuelto por
http.FileServer()
para que vea que el recurso solicitado es
/example.txt
El
http.FileServer()
devuelto por
http.FileServer()
buscará y servirá el contenido de un archivo
relativo
a la carpeta (o más bien
FileSystem
) especificado como su parámetro (usted especificó que
"static"
es la raíz de los archivos estáticos).
Ahora, dado que
"example.txt"
está en la carpeta
static
, debe especificar una ruta relativa para obtener la ruta del archivo actual.
Otro ejemplo
Este ejemplo se puede encontrar en la página de documentación del paquete http ( here ):
// 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"))))
Explicación:
FileServer()
dice que la raíz de los archivos estáticos es
"/tmp"
.
Queremos que la URL comience con
"/tmpfiles/"
.
Entonces, si alguien solicita
"/tempfiles/example.txt"
, queremos que el servidor envíe el archivo
"/tmp/example.txt"
.
Para lograr esto, tenemos que quitar
"/tmpfiles"
de la URL, y el resto será la ruta relativa en comparación con la carpeta raíz
"/tmp"
que si nos unimos da:
/tmp/example.txt