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


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

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

NginxHttpCoreModule से

try_files

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

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

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

उपलब्धता: 0.7.27

क्रम में फ़ाइलों के अस्तित्व के लिए जांच करता है, और पहली फ़ाइल देता है   वह पाया जाता है। एक पिछला स्लैश एक निर्देशिका इंगित करता है - $ 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 कैश फ़ोल्डर की जांच करने के लिए? मैं कोशिश कर रहा हूं और असफल रहा हूं।


49
2017-11-10 03:46


मूल




जवाब:


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 

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

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


50
2017-11-11 01:27



यह बहुत अधिक स्पष्ट है। धन्यवाद। मैं थोड़ा अनिश्चित हूं कि नामित स्थान कैसे काम करता है। अगर @fallback में फास्टसीजीआई php के लिए लाइनें हैं जो इसे php फ़ाइल के रूप में सेवा देगी तो टेक्स्ट? क्या फ़ॉलबैक उपयोग किया जाता है जब इससे पहले कि सबकुछ विफल हो जाए?
एक नामित स्थान केवल सामान्य स्थान पर समान रूप से समान है, सिवाय इसके कि इसे केवल आंतरिक तंत्र जैसे error_page और try_files के माध्यम से एक्सेस किया जा सकता है। Try_files में फ़ॉलबैक केवल तभी उपयोग किया जाता है जब निर्दिष्ट पथों में से कोई भी वैध फ़ाइल में न हो। आपको अभी भी \ .php $ URIs को पकड़ने के लिए एक स्थान की आवश्यकता है क्योंकि अन्यथा try_files $ uri पर ट्रिगर होगा यदि फ़ाइल मौजूद है और इसे सादा-पाठ के रूप में सेवा दें। - Martin Fjordvald
इस उत्तर के लिए धन्यवाद .. मेरे पास अभी भी एक प्रश्न है: क्या try_files तुरंत निष्पादित किया गया है या नेस्टेड स्थान पहले की कोशिश की जाएगी? - Stphane
@Stphane आप यहां धुंधले पानी में जा रहे हैं। Nginx में विरासत जटिल, गन्दा और पूरी तरह से असंगत है। मुझे बस अपने पुराने नोट्स की समीक्षा करना था ताकि इसे याद न किया जाए, इसलिए कोई गारंटी नहीं है, लेकिन ऐसा लगता है कि try_files के लिए, विशेष रूप से केवल नेस्टेड स्थानों से निपटने पर, आंतरिक स्थान मिलान होने पर निष्पादित नहीं होगा। हालांकि, मैं इसका परीक्षण करने की सिफारिश करता हूं। - Martin Fjordvald


Try_files का एक और सुविधाजनक उपयोग यहां, नामित स्थानों पर बिना शर्त रीडायरेक्ट के रूप में है। नामित स्थान कोड के डुप्लिकेशन को बचाने, प्रभावी ढंग से subroutines के रूप में कार्य कर रहे हैं। जब 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;
    }

1
2018-03-02 04:26