2011-12-08 7 views
17

मैं अपने 'स्थान' निर्देशों को अनुकूलित करने की कोशिश कर रहा हूं और यह निर्धारित करने का एक अच्छा तरीका नहीं ढूंढ सकता कि कोई विशिष्ट स्थान मिलान भी प्रयास किया गया है या नहीं। स्थान ब्लॉक के अंदर echo का उपयोग करना यहां सहायता नहीं करता है।एनजीआईएनएक्स 'स्थान' निर्देश मिलान मिलान आदेश को कैसे नियंत्रित करें?

The NGINX ngx_http_core_module documentation कुछ हद तक भ्रमित है।

रेगुलर एक्सप्रेशन का उपयोग करने के लिए आपको एक उपसर्ग का उपयोग करना चाहिए: संवेदनशील मामले मिलान के लिए

  1. ~

  2. ~* असंवेदनशील मामला

कैसे मैच किया जाता है मिलान के लिए:

  1. = उपसर्ग के साथ निर्देश जो क्वेरी को बिल्कुल मेल खाते हैं। यदि पाया जाता है, तो खोज बंद हो जाती है।

  2. पारंपरिक तारों के साथ सभी शेष निर्देश। यदि इस मैच ने ^~ उपसर्ग का उपयोग किया, तो खोज बंद हो जाती है।

  3. नियमित अभिव्यक्तियों, क्रम में वे विन्यास फाइल में परिभाषित हैं।

  4. यदि # 3 ने एक मैच अर्जित किया, तो इसका परिणाम उपयोग किया जाता है। अन्यथा, # 2 का मिलान उपयोग किया जाता है।

संख्या 2 यहाँ "पारंपरिक तार" कहते हैं, लेकिन फिर कहते हैं कि यह ^~ उपसर्ग के साथ इस्तेमाल किया जा सकता। ~ एक RegExp इंगित नहीं करता है? यदि नहीं, तो यह कैसे निर्धारित करता है कि RegExp नहीं है?

  1. शाब्दिक /assets सीधे से बाहर कुछ भी सेवा प्रदान करें:

    विशेष रूप से, मैं निम्नलिखित चाहते हैं। खोज बंद करो।

  2. फास्ट-सीजीआई स्टॉप सर्च के माध्यम से RegExp \.php$|/$ से मेल खाने वाली किसी भी चीज़ की सेवा करें।

  3. शाब्दिक /

इस तरह के माध्यम से किसी और सीधे सब कुछ परोसें, वहाँ गैर-डायनामिक फ़ाइलों संपत्ति के बाहर से सेवा के लिए केवल एक / मैच प्रयास है।

मेरे पास है:

location ^~ /assets {}  # search-terminating literal? or regex? 
location ~ \.php$|/$ {} 
location/{}    # is this match always attempted? 

दस्तावेज़ से, यह लगता है जैसे कि वास्तविक क्रम 1-3-2 होगा, हमेशा शाब्दिक / मैच चल रहा है। हां, यह अनुकूलन वास्तविक प्रदर्शन के लिए कोई फर्क नहीं पड़ता है, लेकिन मैं बस कुछ अस्पष्टता को साफ़ करना चाहता हूं।

उत्तर

7

विकि से:

location =/{ 
    # matches the query/only. 
    [ configuration A ] 
} 
location/{ 
    # matches any query, since all queries begin with /, but regular 
    # expressions and any longer conventional blocks will be 
    # matched first. 
    [ configuration B ] 
} 

तो, यह पहले मिलान किया जाएगा: location ~ \.php$ {}

हालांकि संपत्ति php ब्लॉक आप भी सुरक्षित करना चाहते हैं अंदर location/{}

से बाहर सेवा कर रहे हैं fastcgi से गुजरने से पहले दुर्भावनापूर्ण अपलोड के खिलाफ:

if ($uri ~* "^/uploads/") { 
    return 404; 
} 

जैसा कि आप देख सकते हैं कि nginx आप अपेक्षा से थोड़ा अलग तरीके से काम कर सकते हैं।

+0

मैं अभी भी अस्पष्ट हूं कि रेगेक्स का मिलान पहले क्यों किया जाएगा। दिया गया कोई "=" निर्देश नहीं हैं। अगली अप "परंपरागत तारों के साथ सभी शेष निर्देश" है। '/' एक पारंपरिक स्ट्रिंग है और किसी भी रेगेक्स से पहले मेल खाना चाहिए। पूरे तार-फिर-रेगेक्स एक हैंड होल्डिंग अंतर्निहित अनुकूलन nginx ऐसा लगता है जो मूल्यांकन के सही क्रम को निर्धारित करना असंभव बनाता है। मुझे लगता है कि अपाचे/आईपीटीबल्स इत्यादि अनुमानित रूप से एक ही क्रम में प्रसंस्करण द्वारा सही तरीके से प्रसंस्करण कर सकते हैं जैसे कि/if-if/else ब्लॉक। बिना किसी अंतर्निहित "अधिक/कम" विशिष्ट नियमों के। – leeoniya

+0

ठीक है, यह निश्चित रूप से nginx के बारे में थोड़ा उलझन में है, खासकर nginx 'if' जिसका उपयोग केवल पुनर्लेख/वापसी के लिए किया जाना चाहिए। मुझे लगता है कि वे इसे सरल बनाने पर काम कर रहे हैं। आपकी स्थिति के लिए यह इस प्रकार काम करेगा: 1. php regex एक स्टॉप के साथ चेक करें यदि यह एक मैच है 2./किसी भी स्थिर सामग्री के लिए। – m33lky

+0

आप ऑर्डर के बारे में गलत हैं।/स्ट्रिंग के रूप में संपत्ति नियम रखने का पूरा बिंदु प्रत्येक अनुरोध पर php regex चलाने के ऊपरी हिस्से से बचने के लिए है। वास्तव में, मैं एफसीजीआई के माध्यम से इसे पास किए बिना संपत्ति/दस्तावेज़/example.php जैसी कुछ भी सेवा करना चाहता हूं। मैं वर्तमान में इस सेटअप को चला रहा हूं और regex example.php के लिए नहीं पकड़ता है। इसे^~/परिसंपत्तियों, /, ~ \ .php $ |/$ – leeoniya

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