2012-02-15 15 views
6

Biorąc pod uwagę to struktura folderów:nginx try_files (foldery + pliki) awaryjnej

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

I ten przykład url:

domain.com/user00009/settings1.txt 

Albo

domain.com/xavi/somefile.txt 

chciałbym napisać regułę to pozwól mi zrobić:

folder exists ? check file : 404 

file exists ? serve users file : serve default file 

Próbowałem za pomocą try_files ale myślę, że mogę używać tylko $ uri ja dostać cały adres URL, byłoby świetnie, gdybym mógł pracować z ślimaki (1 $ = user00009 & $ 2 = settings1.txt)

Wtedy może ja może umieścić:

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

Każdy pomysł?

Uwaga: Wiem, że mogłem serwer plików spoza nginx (w tym przypadku Django), ale im próbuje przyspieszyć

Odpowiedz

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

Thanks @Alexander wiem, może to być związane regex, ale co zrobić, jeśli nazwy folderów i plików nie mają nazwy z wzorami? zamiast user0001: alexanderazarov i zamiast settings1.txt: finance.txt? –

+0

Wygląda na to, że: if (! -d $ id_dokumentu 1 $) { Daje mi błąd: S –

+0

Czy jest jakiś problem, który sprawia, że ​​wyrażenie regularne jest mniej szczegółowe? Zobacz moje zmiany. Zawarłem również argument condtion w podwójnych cytatach, ale szczerze mówiąc nie jestem pewien, czy nginx zezwala na '$ document_root' w tym kontekście. Lepiej spróbuj tych zmian, ale prawdopodobnie będziesz musiał napisać '/ var/root $ 1' zamiast tego –

Powiązane problemy