2012-02-15 8 views
6

इस फ़ोल्डर संरचना को देखते हुए:Nginx try_files (फ़ोल्डरों + फ़ाइलें) वापस आने

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

और इस उदाहरण यूआरएल:

domain.com/user00009/settings1.txt 

या

domain.com/xavi/somefile.txt 

मैं एक नियम के बारे में चाहते हैं जो मुझे करने देता है:

folder exists ? check file : 404 

file exists ? serve users file : serve default file 

मैं try_files उपयोग करने की कोशिश, लेकिन मुझे लगता है कि मैं केवल $ uri उपयोग कर सकते हैं मैं पूरे यूआरएल मिलता है, बहुत अच्छा होगा अगर मैं मल ($ 1 = user00009 & $ 2 = settings1.txt)

शायद

तो मैं के साथ काम कर सकता था डाल सकता है:

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

कोई विचार?

नोट: मैं जानता हूँ कि मैं सर्वर के बाहर nginx से फाइल (इस मामले Django में), लेकिन मैं चीजों को तेजी लाने के लिए

उत्तर

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

धन्यवाद @Alexander की कोशिश कर रहा है, मैं इस regex संबंधित हो सकता है पता कर सकते थे, लेकिन क्या होगा यदि फ़ोल्डर और फ़ाइल नाम पैटर्न के साथ नामित नहीं हैं? user0001 के बजाय: alexanderazarov और सेटिंग्स 1.txt: finance.txt के बजाय? –

+0

इस लाइन को लगता है: अगर (! -d $ document_root $ 1) { मुझे एक त्रुटि दे रहा है: S –

+0

क्या रेगेक्स कम विशिष्ट बनाने में कोई समस्या है? कृपया मेरे संपादन देखें। मैंने कंडशन के तर्क को डबल कोट्स में भी लपेट लिया है, लेकिन स्पष्ट रूप से मुझे यकीन नहीं है कि इस संदर्भ में nginx '$ document_root' की अनुमति देता है। आप इन संपादनों को बेहतर तरीके से आजमा सकते हैं, लेकिन शायद आपको –

संबंधित मुद्दे