2013-07-22 7 views
34

मैं समझने की कोशिश कर रहा हूं कि nginx के try_files निर्देश कैसे काम करता है। nginx मेरे सर्वर पर चल रहा है और /usr/share/nginx/html/index.html पर स्थित डिफ़ॉल्ट पृष्ठ की सेवा कर रहा है।मैं यह try_files निर्देश कैसे काम कर सकता हूं?

हालांकि, मेरे पास /var/www/test/index.html पर फाइल सिस्टम में स्थित एक साधारण HTML पृष्ठ है। निम्न कॉन्फ़िगरेशन फ़ाइल उस फ़ाइल को सेवा प्राप्त करने का कारण नहीं बना रही है। मैं समझना चाहता हूं कि क्यों नहीं, और मुझे किस बदलाव की आवश्यकता है ताकि इसे परोसा जा सके।

server { 
    listen  80; 
    server_name localhost; 

    root /var/www; 
    try_files /test/index.html /; 

    location/{ 
     root /usr/share/nginx/html; 
     index index.html index.htm; 
    } 
+0

'try_files' लाइन में पिछली '/' का मतलब क्या था? –

+0

मतलब फ़ॉलबैक विकल्प एक "/" है। ";" से पहले चरित्र सही उस रेखा में। – Jonah

+0

अच्छी तरह से इसे एक फ़ाइल होने की आवश्यकता है, न कि यूआरआई, इसलिए $ uri/या उपयोग /index.html –

उत्तर

115

एक बहुत ही आम try_files रेखा है जो अपनी हालत पर लागू किया जा सकता

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

आप शायद समझ में पहले भाग, location / मैचों है:

यहाँ defualt.conf के संबंधित भाग है सभी स्थानों, जब तक कि यह अधिक विशिष्ट स्थान से मेल नहीं खाता है, उदाहरण के लिए location /test उदाहरण के लिए

दूसरा भाग (try_files) का मतलब है कि जब आप इस ब्लॉक से मेल खाते हैं तो यूआरआई प्राप्त होता है, उदाहरण के लिए $uri उदाहरण के लिए, उदाहरण के लिए http://example.com/images/image.jpg nginx /imagesimage.jpg नामक फ़ाइल को जांचने का प्रयास करेगा, यदि यह पाया जाता है कि यह पहले इसकी सेवा करेगा।

दूसरी शर्त $uri/ अगर आप पहली शर्त $uri एक निर्देशिका के रूप में यूआरआई कोशिश, उदाहरण के http://example.com/images/ के लिए नहीं मिला, ngixn पहले अगर एक फ़ाइल बुलाया images मौजूद है तो यह अभ्यस्त इसे खोजने की जाँच करेगा जिसका अर्थ है है, तो को जाता है दूसरा चेक $uri/ और देखें कि images नामक निर्देशिका है तो यह इसकी सेवा करने का प्रयास करेगी।

साइड नोट: अगर आप की जरूरत नहीं है autoindex on आप शायद, एक 403 निषिद्ध त्रुटि मिलेगी क्योंकि निर्देशिका सूची डिफ़ॉल्ट से मना किया है।

संपादित: मुझे लगता है कि अगर आप index परिभाषित किया गया है, nginx अगर सूचकांक से पहले इस फ़ोल्डर के अंदर मौजूद है निर्देशिका लिस्टिंग की कोशिश कर जाँच करने की कोशिश करेंगे उल्लेख करना भूल गया।

तीसरी शर्त /test/index.html गिरावट वापस विकल्प माना जाता है, के लिए, आप उपयोग कर सकते हैं के रूप में आप (कभी नहीं एक कसना की पहले पढ़ने के लिए) कर सकते हैं (आप कम से कम 2 विकल्प, एक और वापस गिरावट उपयोग करने की आवश्यकता) के रूप में ज्यादा , nginx फ़ाइल index.html फ़ाइल test के अंदर फ़ाइल की तलाश करेगा और यदि यह मौजूद है तो इसे सेवा दें।

यदि तीसरी स्थिति भी विफल हो जाती है, तो nginx 404 त्रुटि पृष्ठ की सेवा करेगा।

इसके अलावा वहाँ कुछ नामित स्थानों कहा जाता है, की तरह इस

location @error { 
} 

आप इस

try_files $uri $uri/ @error; 

टिप तरह try_files से कॉल करने की कर सकते हैं: आप केवल 1 हालत आप सेवा करना चाहते है, तो उदाहरण के लिए उदाहरण images के अंदर आप केवल छवि की सेवा करना चाहते हैं या 404 त्रुटि पर जाना चाहते हैं, तो आप इस

012 जैसी लाइन लिख सकते हैं
location /images { 
    try_files $uri =404; 
} 

जिसका मतलब है या तो फ़ाइल की सेवा या एक 404 त्रुटि की सेवा, आप केवल $uri यह स्वयं के द्वारा =404 बिना उपयोग नहीं कर सकते, क्योंकि आप एक fallback विकल्प की आवश्यकता है।

location /images { 
    try_files $uri =403; 
} 

यदि छवि मौजूद नहीं है यह एक वर्जित त्रुटि दिखाई देगा, या यह सर्वर त्रुटि, आदि दिखा देंगे अगर आप 500 का उपयोग करें:
तुम भी तरह उदाहरण के लिए जो कभी त्रुटि कोड आप चाहते हैं, का चयन कर सकते ..

+0

उस स्पष्टीकरण के लिए धन्यवाद। विशेष रूप से, मेरे ओपी में कोड के साथ क्या गलत है? मैं try_files को किसी स्थान ब्लॉक में और नामित फ़ॉलबैक का उपयोग करके इसे काम करने में सक्षम था। Try_files निर्देशों को स्थान ब्लॉक के बाहर अनुमति नहीं है? या यह समस्या है कि ओपी में मेरे कोड में फॉलबैक एक "/" है? – Jonah

+0

ठीक है मैंने अभी प्रलेखन की जांच की है, http://wiki.nginx.org/HttpCoreModule#try_files, जाहिर है यह स्थान ब्लॉक के बाहर काम करेगा, इसलिए मुझे लगता है कि समस्या यह थी कि आपके पास फ़ॉलबैक विकल्प नहीं था। –

+0

यह स्पष्टीकरण बहुत उपयोगी है! – skyfree

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