L'éditeur PHP Youzi a mentionné deux dossiers dans le système de fichiers dans le cadre de l'adresse du site lors de l'introduction des dossiers virtuels dans le chemin du serveur Web. Dans le langage Go, cette notion de dossiers virtuels est largement utilisée dans le paramétrage des chemins des serveurs web. En incluant ces deux dossiers dans l'adresse du site, une gestion plus flexible du chemin d'accès aux fichiers et un contrôle d'accès peuvent être obtenus. Ce modèle de conception simplifie non seulement l'organisation des fichiers du site, mais offre également une meilleure sécurité et une meilleure maintenabilité. Grâce au concept de dossiers virtuels, les développeurs peuvent gérer et contrôler les ressources du site plus facilement.
Il y a deux dossiers "files1" et "files2" dans mon système de fichiers.
Je peux héberger un dossier dans le système de fichiers en tant que dossier virtuel dans le chemin d'adresse du site comme ceci :
http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./files1"))))
Comment héberger le contenu des dossiers "files1" et "files2" sur le même chemin de l'adresse du site "/public/" ?
Une solution simple consiste à implémenter l'interface http.filesystem.
Voici la démo :
package main import ( "errors" "io/fs" "net/http" ) func main() { http.handle("/public/", http.stripprefix("/public/", http.fileserver(mergeddir{ dir1: "./files1", dir2: "./files2", }))) http.listenandserve(":8080", nil) } type mergeddir struct { dir1 http.dir // dir1 will be tried first so it has higher priority. dir2 http.dir } func (d mergeddir) open(name string) (http.file, error) { f, err := d.dir1.open(name) if err != nil { if errors.is(err, fs.errnotexist) { return d.dir2.open(name) } } return f, err }
J'ai testé avec cette structure de répertoires :
├── files1 │ ├── f1-1.txt │ └── f1-sub │ └── f1-s.txt └── files2 ├── f1-1.txt ├── f2-1.txt └── f2-sub └── f2-s.txt
Il y en a deux en f1-1.txt
,由于先尝试files1
,所以服务的是files1
.
Mise à jour :
Comme demandé par l'auteur, une autre version de mergeddir
prend en charge plusieurs répertoires :
type mergedDir struct { Dirs []http.Dir } func (d mergedDir) Open(name string) (http.File, error) { for _, dir := range d.Dirs { f, err := dir.Open(name) if err == nil { return f, nil } if !errors.Is(err, fs.ErrNotExist) { return f, err } } return nil, fs.ErrNotExist }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!