2012-02-15 19 views
6

Dada esta estructura de carpetas:try_files Nginx (carpetas + archivos) de repliegue

root folder 
    + default 
     + settings1.txt 
     + settings2.txt 
     ... 
     + settingsN.txt 
    + user00001 
     + settings1.txt 
     ... 
    ... 
    + userN 
     + settings1.txt 
     ... 

Y este ejemplo url:

domain.com/user00009/settings1.txt 

O

domain.com/xavi/somefile.txt 

me gustaría escribir una regla que me deja hacer:

folder exists ? check file : 404 

file exists ? serve users file : serve default file 

He intentado utilizar try_files pero creo que sólo se puede usar $ uri consigo toda la url, sería genial si pudiera trabajar con las babosas ($ 1 = user00009 & $ 2 = settings1.txt)

Entonces tal vez podría poner:

location/{ 
    root /... 
    try_files $1/$2 default/$2 =404; 
} 

¿Alguna idea?

Nota: Sé que podría servidor de los archivos de nginx exterior (en este caso), pero Django Im tratando de acelerar las cosas

Respuesta

8
location ~ ^(/[^/]+)(/.+)$ { 
    root ...; 
    if (!-d "$document_root$1") { 
    return 404; 
    } 
    try_files $1$2 /default$2 =404; 
} 
+0

Gracias @Alexander, sé que esto puede ser la expresión regular relacionados, pero ¿Qué sucede si los nombres de carpeta y archivo no se nombran con patrones? en lugar de user0001: alexanderazarov y en lugar de settings1.txt: finance.txt? Parece –

+0

esta línea: si (-d $ document_root $ 1 en el electrónico) { me da un error: S –

+0

¿Hay un problema de expresiones regulares para hacer menos específico? Por favor mira mis ediciones También envolví el argumento de la condición en comillas dobles, pero francamente no estoy seguro de que nginx permita '$ document_root' en este contexto. Es mejor que intentes estas ediciones, pero probablemente tendrás que escribir '/ var/root $ 1' en lugar de –

Cuestiones relacionadas