2010-02-15 7 views
36

Je suis en train de développer une application basée sur Rack et je souhaite rediriger toutes les demandes de fichiers (par exemple filename.filetype) vers un dossier spécifié. Rack :: Static ne prend en charge que les demandes de fichiers pour un dossier spécial (par exemple "/ media")Comment servir les fichiers statiques via Rack?

Dois-je écrire un propre middleware Rack ou existe-t-il une solution prête à l'emploi?

Meilleures salutations

Répondre

36

Pour rediriger toutes les requêtes à un chemin particulier, utilisez Rack::File (pour une raison quelconque cette classe est absente dans la documentation récente, mais il est still part of la dernière rack):

run Rack::File.new("/my/path") 

Pour rediriger toutes les demandes, et ajouter un index HTML de tous les fichiers dans le répertoire cible, utilisez Rack::Directory:

run Rack::Directory.new("/my/path") 

Pour combiner plusieurs répertoires ou servir seulement des demandes du répertoire cible:

map "/url/prefix" do 
    run Rack::File.new("/my/path") 
end 

# More calls to map if necessary... 

# All other requests. 
run MyApp.new 
+0

Je devais envelopper la course MyApp.new avec la carte "/" do .. end. Sinon, j'obtenais une erreur de méthode d'appel non définie. (Aucune idée pourquoi.) –

9

Vous pourriez être en mesure d'utiliser directement Rack::File. Voici un fichier config.ru vous pouvez brancher sur rackup pour voir fonctionner:

app = proc do |env| 
    Rack::File.new('foo/bar').call(env) 
end 

run app 
2
run Rack::Directory.new(Dir.pwd) 
9

Une mise à jour, la dernière mise en œuvre du rack vous permet d'utiliser Rack::Static

Exemple:

use Rack::Static, :urls => ["/media"] 

Servira toutes les ressources statiques sous le dossier ./media par rapport à l'emplacement config.ru.

Questions connexes