with golang application app http go url-rewriting server url-routing

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