2010-04-04 19 views
12

È possibile pubblicare file statici con Sinatra posizionandoli in public/ (per impostazione predefinita) - Al momento ho un index.html, ma come posso fare in modo che il punto di root sia il file in questione senza doverlo analizzare come modello?Routing di pagina statico in Sinatra (Ruby)

Per essere chiari, posso accedere con successo a /index.html e mi piacerebbe instradare lo / allo stesso file statico, ma senza reindirizzamento. Qualche idea su come fare questo?

risposta

18

Probabilmente verrà una risposta migliore, fino ad allora questo è il mio colpo.

Se questo non è ciò che si vuole:

get '/' do 
    redirect '/index.html' 
end 

si potrebbe fare qualcosa di simile:

get '/' do 
    File.new('public/index.html').readlines 
end 

mi piacerebbe andare con il primo uno, però, non so perché si vuole evitare che reindirizzamento

+0

votare per la prima soluzione. anche se usi il passeggero, questo funziona. nessun instradamento richiesto o reindirizzamento. – rubiii

+1

@rubii Penso che varrebbe la pena mettere il passeggero nella propria risposta. Mi sembra una risposta più corretta della mia. –

+0

Penso che la tua risposta sia perfetta. scommetterei che JP non sta usando il passeggero. ma posterò una risposta per tutti gli altri. – rubiii

3

utilizzando passenger sembra funzionare appena fuori dalla scatola. avere un file index.html nella directory pubblica e nessun routing richiama l'index.html quando si accede all'URL di root.

6

Basta impostare enable :static all'interno della classe dell'app. In questo modo:

class App < Sinatra::Base 
    # Set the app root; this is where the 'public' and 'views' 
    # directories are found (by default). 
    set :root, File.expand_path("#{File.dirname(__FILE__)}/../app") 

    # Allow the app to serve static files from the 'public' directory in :root 
    enable :static 
end 
3

Credo che questo è solo un problema perché Sinatra/Rack non ha il concetto di un file di default per servire se si va a /. In un server web come Apache o Nginx questo è gestito per te e di solito è impostato su index.html index.htm (se esiste esiste che verrà reso disponibile quando si accede a una directory senza nome file effettivo alla fine).

Quando tutti dicono che questo è incorporato in Passenger, penso che in realtà significhi che sia incorporato in Apache/Nginx. Apache/Nginx controllerà se il file statico esiste e lo serve se lo fa, la richiesta non arriverà mai a Rack, il che è fantastico per le prestazioni.

Non vorrei impostare un reindirizzamento alla pagina 404 poiché questo tipo viola l'intera idea dell'HTTP: dovrebbe esserci un endpoint per tutto ciò che il punto finale dovrebbe restituire lo stato vero di quell'endpoint. Significa che se vai a /asdf tu vuoi il webserver per segnalare un 404 perché è quello che sta effettivamente succedendo. Se esegui un reindirizzamento, ora il tuo sito sta dicendo "Avevo qualcosa qui, ma si è trasferito" e quindi la pagina a cui ti reindirizza, anche se dice 404 nel testo della pagina, viene effettivamente segnalata dal web server come 200, che significa "tutto va bene con questa pagina!"