2011-03-21 23 views
8

Me pregunto qué ubicación o reescritura nginx directiva para hashbang (#!) Urls se vería. Básicamente enrutar todas las URLs que no son hash-banged a través del hashbang como un controlador frontal. Por lo tanto:NGINX hashbang reescribir

http://example.com/about/staff 

encaminaría a

http://example.com/#!/about/staff 

estoy claro cuál sería la mejor técnica aquí? Ya sea escribiendo una sentencia if para verificar la existencia del hashbang, o simplemente una reescritura genérica que filtra todas las solicitudes ...

Respuesta

11

Los identificadores de fragmentos no/no deben (algunos clientes con errores pueden enviarlos) aparecen en una Solicitud de HTTP, por lo que no puede tener una regla de reescritura para que coincida con ellos, independientemente del servidor web.

The HTTP engine cannot make any assumptions about it. The server is not even given it.

Si se trató de hacer la solicitud inicial de/redirigir a/#! en lugar de servir el índice raíz, terminaría con un error de "demasiados redireccionamientos", ya que el cliente volvería a solicitar/nuevamente (recuerde que no enviará el # con su solicitud). Tendrá que hacer esto con javascript en su lugar para el documento de índice.

La conclusión es que no está disponible en el servidor en la solicitud GET. Incluso curl has been patched para no enviarlo más.

Usted podría tener directivas ubicación nginx para hacer todo lo demás golpeó el controlador frontal sin embargo:

location =/{ 
    }  

    location = /index.html { 
    }  

    location ~/{ 
    rewrite^/#!$uri redirect; 
    break; 
    } 

Cuidado con este enfoque, aunque; http://jenitennison.com/blog/node/154 entra en muchos más detalles sobre la debacle de hashbang en Gawker y otras cuestiones relacionadas con su uso.

+0

Una mejor alternativa sería la directiva 'try_files'. Quizás no estaba cerca cuando esto fue respondido. Ver mi respuesta –

2

Como una modificación de la anterior, sólo hago esta redirección de llamadas específicas, y de ahí no consigo espaldas bucle potenciales:

location ~ /login|/logout|portfolios|/portfolio/*|/public/* { 
    rewrite^/#!$uri permanent; 
    break; 
} 

Tenga en cuenta que esto funciona bien en todos los navegadores excepto para Safari. Safari te redirigirá a la url sin el hash.

-1

La mejor ruta es utilizar el try_files Directiva:

location { 
    try_files $uri $uri/ /index.html; 
} 

Suponiendo que el archivo contiene la lógica index.html javascript que las rutas de hash al recurso correcto. El URI seguirá siendo lo que solicitó el visitante, mientras que Nginx simplemente enruta la solicitud a su archivo de índice cuando no se puede encontrar un archivo de coincidencia real para la solicitud uri.

+0

¿Te estás perdiendo un '~' Wes? –