2015-08-11 8 views
18

से निर्देशिका को छोड़कर मैं अंडरस्कोर के साथ सभी यूआरएल को उनके डैश किए गए समकक्ष पर रीडायरेक्ट करना चाहता हूं।रेगेक्स रीडायरेक्ट

उदा। /nederland/amsterdam/car_rental/nederland/amsterdam/car-rental बन जाता है। इसके लिए मैं यहां वर्णित तकनीक का उपयोग कर रहा हूं: How to replace underscore to dash with Nginx। तो मेरी स्थान ब्लॉक करने के लिए मिलान किया जाता है:

location ~ (_) 

लेकिन मैं केवल/admin नाम स्थान में नहीं यूआरएल पर ऐसा करना चाहते हैं । इसे पूरा करने के लिए मैंने ऋणात्मक लुकअप के साथ रेगेक्स को संयोजित करने का प्रयास किया: Regular expression to match a line that doesn't contain a word?

(?=^(?!\/admin))(?=([^_]*)) 

Rubular रिपोर्ट स्ट्रिंग /nederland/amsterdam/car_rental रेगुलर एक्सप्रेशन से मेल करने के लिए है, जबकि /admin/stats_dashboard दर्ज नहीं होता है, मैं इसे देखना चाहते बस के रूप में: के साथ स्थान अब मेल खाता है। हालांकि जब मैं इस नियम को nginx कॉन्फ़िगरेशन पर लागू करता हूं, तो साइट रीडायरेक्ट लूप में समाप्त होती है। क्या मैंने कुछ भी अनदेखा किया है?

अद्यतन: मैं वास्तव में /admin नामस्थान में कुछ भी लिखना नहीं चाहता हूं। अंडरस्कोर-टू-डैश रीराइट केवल /admin नामस्थान में पर सभी यूआरएल पर ही होना चाहिए।

उत्तर

4
^(?!\/admin\b).* 

तुम बस lookahead .See डेमो के साथ इस सरल regex की जरूरत है।

https://regex101.com/r/uF4oY4/16

आपका regex /nederland/amsterdam/car_rental भी विफल हो जाएगा के रूप में यह _ तो केवल स्ट्रिंग /nederland/amsterdam/car विचार किया जाएगा है।

या

आप उपयोग कर सकते

rewrite ^(?!\/admin\b)([^_]*)_(.*)$ $1-$2; 
+0

यह नमूना कोड कुशल नहीं है, क्योंकि आपको सभी अंडरस्कोर से छुटकारा पाने के लिए कई बार '$ uri' से गुजरना होगा। – cnst

8

Nginx location matching order ऐसी है कि स्थानों नियमित अभिव्यक्ति का उपयोग करके परिभाषित और विन्यास फाइल में उनकी उपस्थिति नियमित अभिव्यक्ति की तलाश के क्रम में जाँच कर रहे हैं पर समाप्त हो जाता है पहला मैच

इस ज्ञान के साथ, आपके जूते में, मैं ऊपर दिए गए "व्यवस्थापक" के लिए नियमित अभिव्यक्ति का उपयोग करके एक स्थान को परिभाषित कर दूंगा, जिसके लिए आप Stack Overflow Answer से जुड़े अंडरस्कोर के लिए हैं। क्योंकि मिलान स्थान ब्लॉक कि अंडरस्कोर के लिए पहले दिखाई देने वाला

location ~ (\badmin\b) { 
    # Config to process urls containing "admin" 
} 
location ~ (_) { 
    # Config to process urls containing "_" 
} 

उस में admin साथ किसी भी अनुरोध कोई फर्क नहीं पड़ता कि क्या यह एक अंडरस्कोर है या नहीं पहले स्थान ब्लॉक द्वारा कार्रवाई की जाएगी।

** पी एस **

एक और उत्तर कुछ दिनों के CNST द्वारा पोस्ट की गई के रूप में मेरा पता चलता बाद, स्थान मिलान के क्रम मैं भी तैनात पर प्रलेखन के लिए लिंक इंगित करता है कि आप भी करने के लिए ^~ संशोधक का उपयोग कर सकते हैं /admin फ़ोल्डर से मेल करें और अंडरस्कोर के लिए स्थान ब्लॉक छोड़ें।

मैं व्यक्तिगत रूप से इस संशोधक का उपयोग नहीं करता हूं और एनोटेटेड टिप्पणियों के साथ बैंड रेगेक्स आधारित स्थानों को पसंद करता हूं लेकिन यह निश्चित रूप से एक विकल्प है।

हालांकि, आपको "/ admin" से शुरू होने वाले अनुरोधों के रूप में, आपके सेटअप के आधार पर सावधान रहना होगा, लेकिन लंबे समय से, संशोधक के साथ मिलान हो सकता है और अप्रत्याशित परिणामों का कारण बन सकता है।

जैसा कि कहा गया है, मैं अपने रेगेक्स आधारित दृष्टिकोण को ज्ञान में सुरक्षित करना पसंद करता हूं कि कोई भी स्पष्ट समझ के बिना कॉन्फ़िगरेशन फ़ाइल में चीजों के क्रम को मनमाने ढंग से बदलना शुरू नहीं करेगा।

+2

मैं मानता हूं कि यह केवल एक अभिव्यक्ति का उपयोग करने की कोशिश करने से बेहतर दृष्टिकोण है। –

+0

मैं बस इसका जवाब देने जा रहा था, लेकिन आप तेज़ थे। =) उपरोक्त। –

+0

स्ट्रिंग उपसर्ग मिलान (जैसा कि दूसरे उत्तर में है) regex मिलान — से तेज़ है, इस सवाल में कुछ भी नहीं है कि '/ admin' 'uri' उपसर्ग स्ट्रिंग नहीं है (इस तरह का विचार इसके बजाय जल्द से जल्द उत्तर में स्वयंसेवा किया गया था तब से हटा दिया गया है), इस तरह, यह जवाब इष्टतम नहीं है। इसके अलावा, 'स्थान' निर्देशों के क्रम पर अनिवार्य रूप से भरोसा करने के लिए एक निश्चित तरीका है जब कोई व्यक्ति कोड महीनों या वर्षों को फिर से व्यवस्थित करने का निर्णय लेता है, तो उस स्थान को ऑर्डर करने का निर्णय लेता है, जो स्थान के क्रम को भूल जाता है निर्देश मायने रखता है। – cnst

4

आप स्पष्ट रूप से एक ही रास्ता या अन्य का उल्लेख नहीं किया है, लेकिन यह प्रकट होता है कि आप की संभावना केवल एक ही /admin नाम स्थान है, जो $uri का उपसर्ग रूपों है और एक ^/admin.*$ रेगुलर एक्सप्रेशन से मेल होगा; मुझे ऐसी धारणा के आधार पर दो गैर-विरोधी कॉन्फ़िगरेशन विकल्प प्रदान करने दें।


दूसरों के रूप में सुझाव दिया है, तो आप /admin के लिए एक अलग location उपयोग करने के लिए चाहते हो सकता है।

हालांकि, अन्य जवाब के विपरीत, मैं तुम्हें एक उपसर्ग स्ट्रिंग द्वारा यह निर्धारित करें और ^~ संशोधक का उपयोग एक सफल मैच के बाद नियमित अभिव्यक्ति की जांच नहीं करने के लिए करने की सलाह देंगे।

location ^~ /admin { 
} 

वैकल्पिक रूप से, या यहां तक ​​कि इसके साथ ही मन की एक अतिरिक्त शांति और एक पक्का दृष्टिकोण के बजाय का उपयोग कर क्या जुड़ा हुआ जवाब से एक गैर POSIX रेगुलर अभिव्यक्ति प्रतीत होता है (के लिए करता है, तो के मेरे पढ़ने re_format(7) on OpenBSD पर विश्वास किया जाना चाहिए), उन लोगों पर विचार करें जो बहुत आसान हैं, ज्यादातर लोगों द्वारा समझा जाने की गारंटी है जो दावा करेंगे कि वे जानते हैं कि आरई क्या हैं, और हर जगह काम करते हैं, उल्लेख करने की संभावना अधिक कुशल नहीं है, क्योंकि आप पहले ही जानते हैं कि यह पहले से ही है ^/admin.* पथ जिसे आप बाहर करना चाहते हैं:

location ~ ^/[^a][^d][^m][^i][^n].*_.* { 
} 

अपना लक्ष्य पूरा करने के लिए, आप इनमें से किसी एक समाधान का उपयोग कर सकते हैं, या यहां तक ​​कि दोनों अधिक कठोर और मूर्ख साबित हो सकते हैं।

+0

आप एकल '/ admin' नामस्थान के बारे में सही हैं। जबकि आपका समाधान अच्छा लगता है, यह पथ/एम्स्टर्डम/टेस्ट' पर काम नहीं करता है। जाहिर है क्योंकि यह "ए" से शुरू होता है। – richard