स्थान पथ में Nginx वाइल्डकार्ड / regex


22

Nginx config मेरे पास 404 है .phpजैसे कि:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

हालाँकि मेरे पास सबफ़ोल्डर में कुछ index.php फ़ाइल है जिसे मैं चलाना चाहता हूं। वर्तमान विन्यास इस प्रकार है:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

यह पूरी तरह से काम करता है, लेकिन मुद्दा डुप्लिकेट स्थान है और यदि बहुत सारे सबपेज हैं तो कॉन्फ़िगरेशन बहुत बड़ा हो जाता है।

मैंने * और कुछ रेगेक्स जैसे वाइल्डकार्ड की कोशिश की, जो कहते हैं कि नेग्नेक्स टेस्ट पास हो गया लेकिन पेज लोड नहीं होता है अर्थात 404। मैंने जो कोशिश की वो हैं:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

वहाँ किसी भी तरह से मैं regex या वाइल्डकार्ड के रूप में स्थान में कुछ pathname हो सकता है?

जवाबों:


32

=में संशोधक locationब्लॉक किसी भी वाइल्डकार्ड, उपसर्ग मिलान या रेगुलर एक्सप्रेशन के बिना, एक सटीक मिलान है। इसलिए यह काम नहीं करता है।

अपने regex प्रयास पर, के [a-z]बीच aऔर एक एकल चरित्र से मेल खाता है z। इसलिए यह आपके लिए काम नहीं करता है।

आपको अपने स्थानों को निम्नलिखित की तरह स्थापित करना होगा। locationबयानों का क्रम नोट करें । नगीनक्स पहले मिलान रेगेक्स स्थिति चुनता है।

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

मैं यहां केस संवेदी मिलान ( ~इसके बजाय संशोधक ~*) का उपयोग करता हूं । पहले मामले में, मैं पथ के पहले भाग से मेल खाता हूं, फिर एक या अधिक अक्षर / संख्या वर्ण और फिर index.php। आप मैच रेंज को संशोधित कर सकते हैं, लेकिन +"एक या अधिक" पुनरावृत्ति के लिए याद रखें ।

दूसरा किसी भी यूआरआई के साथ समाप्त होता है .php। जिस तरह से नियमित भाव काम करते हैं, आपको अपने संस्करण में अतिरिक्त पात्रों की आवश्यकता नहीं है।


धन्यवाद, हाँ मुख्य चीज़ पुनरावृत्ति regex से गायब थी। +ठीक कर दिया।

1

ऑर्डर महत्वपूर्ण है, नंगेक्स के "स्थान" विवरण से :

दिए गए अनुरोध के मिलान वाले स्थान को खोजने के लिए, nginx पहले उपसर्ग स्ट्रिंग्स (उपसर्ग स्थानों) का उपयोग करके परिभाषित स्थानों की जांच करता है। उनमें से, सबसे लंबे मिलान वाले उपसर्ग के साथ स्थान का चयन और याद किया जाता है। फिर कॉन्फ़िगरेशन फ़ाइल में उनकी उपस्थिति के क्रम में नियमित अभिव्यक्ति की जांच की जाती है। नियमित अभिव्यक्तियों की खोज पहले मैच पर समाप्त होती है, और संबंधित कॉन्फ़िगरेशन का उपयोग किया जाता है। यदि नियमित अभिव्यक्ति के साथ कोई मेल नहीं मिलता है, तो पहले याद किए गए उपसर्ग स्थान के कॉन्फ़िगरेशन का उपयोग किया जाता है।

इसका मतलब:

  • सबसे पहले =। ("सबसे लंबा मिलान उपसर्ग" मैच)
  • फिर निहित है। ("सबसे लंबा मिलान उपसर्ग" मैच)
  • फिर रेगेक्स। (पहला मैच)

आपको रेगेक्स भागों के क्रम को समायोजित करने की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.