2010-04-04 14 views
12

Puede servir archivos estáticos con Sinatra colocándolos en public/ (de forma predeterminada) - Tengo un index.html allí por el momento, pero ¿cómo puedo hacer que el punto raíz sea ese archivo? sin tener que analizarlo como una plantilla?Enrutamiento de página estática en Sinatra (Ruby)

Para que quede claro, puedo tener acceso /index.html éxito, y me gustaría encaminar / a ser el mismo archivo estático, pero sin redirigir. ¿Alguna idea de cómo hacer esto?

Respuesta

18

Probablemente llegue una mejor respuesta, hasta entonces esta es mi oportunidad.

Si esto no es lo que quiere:

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

Usted podría hacer algo como esto:

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

Me quedo con el primero, sin embargo, No sé por qué se quiere evitar redirigir

+0

votación para la primera solución. también si usas pasajeros, esto simplemente funciona. no se requiere enrutamiento ni redirección. – rubiii

+1

@rubii Creo que valdría la pena poner al pasajero en su propia respuesta. Parece una respuesta más correcta que la mía –

+0

, creo que tu respuesta está perfectamente bien. Apostaría que JP no está usando pasajero. pero publicaré una respuesta para todos los demás. – rubiii

3

usando passenger esto parece funcionar nada más sacarlo de la caja. tener un archivo index.html en el directorio público y ningún enrutamiento abre el index.html al acceder a la url raíz.

6

Simplemente configure enable :static dentro de su clase de aplicación. De este 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

Creo que esto es sólo un problema porque Sinatra/rack no tiene el concepto de un archivo predeterminado para servir si sólo ir a /. En un servidor web como Apache o Nginx, esto se soluciona por usted y normalmente está predeterminado en index.html index.htm (si existe, se publicará cuando vaya a un directorio sin nombre de archivo real al final).

Cuando todos dicen que esto está integrado en Passenger, creo que realmente quieren decir que está integrado en Apache/Nginx. Apache/Nginx verificará si el archivo estático existe y lo servirá si lo hace, la solicitud nunca llegará a Rack, lo cual es impresionante para el rendimiento.

No me gustaría configurar un redireccionamiento a la página 404 ya que este tipo de violación a la idea de HTTP: debe haber un punto final para todo lo que el punto final debe devolver el verdadero estado de ese punto final. Lo que significa que si va al /asdf, quiere el servidor web para informar un 404 porque eso es lo que realmente está sucediendo. Si realiza un redireccionamiento, ahora su sitio dice "Solía ​​tener algo aquí, pero se movió" y luego la página a la que lo redirecciona, a pesar de que dice 404 en el texto de la página, en realidad lo informa la web. server as a 200, que significa "¡todo está bien en esta página!"

Cuestiones relacionadas