Try_files कैसे काम करता है?


72

मैंने nginx प्रलेखन को देखा और यह अभी भी मुझे पूरी तरह से भ्रमित करता है।

कैसे try_filesकाम करता है ? यहाँ दस्तावेज क्या कहते हैं:

NginxHttpCoreModule से

try_files

वाक्यविन्यास: try_files path1 [path2] uri

डिफ़ॉल्ट: कोई नहीं

संदर्भ: सर्वर, स्थान

उपलब्धता: 0.7.27

क्रम में फ़ाइलों के अस्तित्व के लिए जाँच करता है, और जो पहली फ़ाइल मिली है उसे लौटाता है। एक अनुगामी स्लैश एक निर्देशिका को इंगित करता है - $ uri /। इस घटना में कि कोई फ़ाइल नहीं मिली है, अंतिम पैरामीटर पर एक आंतरिक पुनर्निर्देशित किया गया है। अंतिम पैरामीटर कमबैक URI है और मौजूद होना चाहिए , अन्यथा एक आंतरिक त्रुटि उठाई जाएगी। पुनर्लेखन के विपरीत, यदि कोई नामांकित स्थान नहीं है तो $ args स्वचालित रूप से संरक्षित नहीं हैं। यदि आपको संरक्षित आर्ग्स की आवश्यकता है, तो आपको ऐसा स्पष्ट रूप से करना चाहिए:

मुझे समझ नहीं आ रहा है कि यह कैसे रास्तों की जाँच करता है और क्या होगा यदि मैं एक आंतरिक त्रुटि नहीं चाहता, लेकिन क्या उसने किसी अन्य फ़ाइल को खोजने के प्रयास में शेष पथ को फिर से शुरू किया है?

अगर मैं एक कैश्ड फ़ाइल को आज़माना चाहता हूं /path/app/cache/url/index.htmlऔर अगर यह कोशिश करने में विफल रहता है /path/app/index.phpतो मैं इसे कैसे लिखूंगा? अगर मैंने लिखा है:

try_files /path/app/cache/ $uri
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;

मेरे पास है index index.php index.html index.htm;। जब मैं दौरा /urlnameकरूंगा, /path/app/cache/urlname/index.phpतो /path/app/cache/urlname/index.htmlक्या यह जांचने की कोशिश करेगा ? अगर हम कैश फोल्डर की जांच try_filesकरना संभव है, तो हम सब कुछ अनदेखा कर देते हैं try_files? मैं कोशिश कर रहा हूं और असफल रहा हूं।

जवाबों:


64

try_files परिभाषित रूट निर्देश के संबंध में आपके द्वारा निर्दिष्ट शाब्दिक पथ की कोशिश करता है और आंतरिक फ़ाइल पॉइंटर सेट करता है। आप उदाहरण के लिए उपयोग करते हैं try_files /app/cache/ $uri @fallback;के साथ index index.php index.html;तो यह इस क्रम में पथ का परीक्षण होगा:

  1. $document_root/app/cache/index.php
  2. $document_root/app/cache/index.html
  3. $document_root$uri

अंत में आंतरिक रूप से नामांकित स्थान पर पुनर्निर्देशित करने से पहले। आप =404अपने अंतिम पैरामीटर के रूप में एक फ़ाइल या एक स्थिति कोड ( ) का भी उपयोग कर सकते हैं लेकिन यदि किसी फ़ाइल का उपयोग कर रहे हैं तो उसका अस्तित्व होना चाहिए

आपको ध्यान देना चाहिए कि try_files अपने आप में अंतिम पैरामीटर के अलावा किसी भी चीज़ के लिए आंतरिक पुनर्निर्देशन जारी नहीं करेगा। आप निम्न कार्य नहीं कर सकते हैं: try_files $uri /cache.php @fallback;जैसा कि nginx के कारण आंतरिक फ़ाइल पॉइंटर को $ document_root / cache.php पर सेट करने और उसकी सेवा करने का कारण होगा, लेकिन चूंकि कोई आंतरिक पुनर्निर्देशन नहीं होता है, इसलिए स्थानों का पुनर्मूल्यांकन नहीं किया जाता है और जैसे कि यह होगा सादे पाठ के रूप में सेवा की। (यह सूचकांक के रूप में PHP फाइलों के साथ काम करने का कारण है कि सूचकांक निर्देश एक आंतरिक पुनर्निर्देशन जारी करेगा )


2
यह बहुत स्पष्ट है। धन्यवाद। मैं थोड़ा अनिश्चित हूं कि नामित स्थान कैसे काम करता है। अगर @fallback में fastcgi php की पंक्तियाँ हैं जो इसे php फ़ाइल के रूप में प्रस्तुत करेगा तो पाठ? क्या फालबैक का उपयोग तब किया जाता है जब सब कुछ विफल हो जाता है?

2
एक नामित स्थान केवल एक सामान्य स्थान के लिए कार्यात्मक रूप से समान है, सिवाय इसके कि इसे आंतरिक तंत्र जैसे error_page और try_files के माध्यम से ही एक्सेस किया जा सकता है। Try_files में गिरावट का उपयोग केवल तब किया जाता है जब निर्दिष्ट पथों में से कोई भी एक मान्य फ़ाइल में परिणाम नहीं करता है। यदि आपको फ़ाइल मौजूद है और इसे सादा-पाठ के रूप में सेवा करना है, तो भी आपको $। URI को पकड़ने के लिए एक स्थान की आवश्यकता होगी।
मार्टिन फॉर्डोर्डवल्ड

इस उत्तर के लिए धन्यवाद .. मेरा अभी भी यहां एक सवाल है: क्या try_files को तुरंत निष्पादित किया गया है या पहले नेस्टेड स्थान की कोशिश की जाएगी?
स्टेफेन

@ स्टेफेन आप यहां के पानी में चले जा रहे हैं। नग्नेक्स में विरासत जटिल, गन्दा और पूरी तरह से असंगत है। मुझे अपने पुराने नोटों की समीक्षा करनी थी ताकि यह याद रहे कि यह कोई गारंटी नहीं है, लेकिन ऐसा लगता है कि try_files के लिए, विशेष रूप से जब केवल नेस्टेड स्थानों से निपटना हो, तो आंतरिक स्थान से मेल खाने पर निष्पादित नहीं होगा। हालांकि, मैं इसका परीक्षण करने की सलाह दूंगा।
मार्टिन फॉर्डोर्वाल्ड

5

नाम स्थानों के बिना शर्त पुनर्निर्देश के रूप में यहाँ try_files का एक और सुविधाजनक उपयोग है। नामित स्थान प्रभावी रूप से उप-रेखाओं के रूप में कार्य कर रहे हैं, कोड के दोहराव को बचाते हैं। जब try_files के लिए पहला तर्क "_" होता है, तो फ़ॉलबैक रीडायरेक्ट हमेशा लिया जाता है।

    location =/wp-login.php { try_files _ @adminlock; }
    location ^~ /wp-admin/  { try_files _ @adminlock; }
    location @adminlock  {
            allow 544.23.310.198;
            deny all;
            try_files _ @backend;
            # wp-admin traffic is tiny so ok to send all reqs to backend 
    }
    location ~ \.php {  try_files _ @backend; }
    location / { try_files $uri $uri/ =403; }
    location @backend {
            fastcgi_pass 127.0.0.1:9000;
            include snippets/fastcgi-php.conf;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.