NGINX कॉन्फ़िगरेशन में दो स्थानों के लिए मेरे पास एक ही नियम कैसे हो सकता है?


153

NGINX कॉन्फ़िगरेशन में दो स्थानों के लिए मेरे पास एक ही नियम कैसे हो सकता है?

मैंने निम्नलिखित कोशिश की है

server {
  location /first/location/ | /second/location/ {
  ..
  ..
  }
}

लेकिन nginx पुनः लोड इस त्रुटि को फेंक दिया:

nginx: [emerg] invalid number of arguments in "location" directive**

जवाबों:


239

प्रयत्न

location ~ ^/(first/location|second/location)/ {
  ...
}

~साधन यूआरएल के लिए रेगुलर एक्सप्रेशन का उपयोग करने के लिए। ^पहले चरित्र से जाँच करने का साधन। यह /किसी भी स्थान और उसके बाद किसी अन्य स्थान पर दिखेगा /


37
नोट: यदि यह अक्सर (हजारों की तरह) होता है, तो यह regex मिलान के कारण एक प्रदर्शन जुर्माना होगा। इसके अलावा मिलान का क्रम काफी अलग है। बहुत सारे "छोटे" मामलों में, आप जैसा चाहते हैं, वैसा ही व्यवहार करेगा, लेकिन इससे अवगत रहने के लिए कुछ है। मैं व्यक्तिगत रूप से Nginx "स्थान" को regex नियम पर भरोसा करने के बजाय एकाधिक "=" स्थितियों का समर्थन करना चाहता हूं।
बर्नार्ड

7
IMHO, यह अधिक कुशल होना चाहिए: स्थान ~ (patternOne | patternTwo) {...}
stamster

2
यह समाधान मेरे काम नहीं आया; हालाँकि @ stamster की टिप्पणी ने किया; मैं चल रहा हूँnginx/1.13.2
टीजे बिडल

1
यदि आपको proxy_passकाम करने की आवश्यकता है, तो यह उत्तर देखें: stackoverflow.com/a/46625656/1246870
avs099

1
यह मेरे लिए काम नहीं करता है जब मूल URL बिना किसी स्लैश के समाप्त हो जाता है
द गॉडफादर

88

एक अन्य विकल्प एक सम्मिलित फ़ाइल का उपयोग करके दो उपसर्ग स्थानों में नियमों को दोहराना है। चूंकि उपसर्ग स्थान कॉन्फ़िगरेशन में स्वतंत्र हैं, इसलिए उनका उपयोग करने से कुछ भ्रम की स्थिति बच सकती है क्योंकि आप अन्य रेगेक्स स्थानों को बाद में जोड़ते हैं। रेगेक्स स्थानों से बचना जब आप अपने कॉन्फ़िगरेशन पैमाने को सुचारू रूप से चलाने में मदद करेंगे।

server {
    location /first/location/ {
        include shared.conf;
    }
    location /second/location/ {
        include shared.conf;
    }
}

यहाँ एक नमूना साझा किया गया है ।conf:

default_type text/plain;
return 200 "http_user_agent:    $http_user_agent
remote_addr:    $remote_addr
remote_port:    $remote_port
scheme:     $scheme
nginx_version:  $nginx_version
";

क्या आप कृपया shared.confउदाहरण और स्थान जोड़ सकते हैं ?
मित्राल्वन Кулешов

5
मैंने एक उदाहरण साझा किया है ।conf फ़ाइल। आप साझा करने के लिए एक पूर्ण पथ का उपयोग कर सकते हैं ।conf या इसे अपने nginx निर्देशिका में रखें। इस मामले में, इसमें सिर्फ एक युगल निर्देश शामिल हैं।
कोल टिरनी

40

रेगेक्स और शामिल दोनों फाइलें अच्छे तरीके हैं, और मैं अक्सर उन का उपयोग करता हूं। लेकिन एक अन्य विकल्प "नामित स्थान" का उपयोग करना है, जो कई स्थितियों में एक उपयोगी दृष्टिकोण है - विशेष रूप से अधिक जटिल वाले। आधिकारिक पृष्ठ "अगर बुराई है" शो अनिवार्य रूप से एक अच्छा तरीका है काम करने के लिए के रूप में निम्नलिखित:

error_page 418 = @common_location;
location /first/location/ {
    return 418;
}
location /second/location/ {
    return 418;
}
location @common_location {
    # The common configuration...
}

इन विभिन्न दृष्टिकोणों के फायदे और नुकसान हैं। एक regex के लिए एक बड़ा फायदा यह है कि आप मैच के कुछ हिस्सों पर कब्जा कर सकते हैं और प्रतिक्रिया को संशोधित करने के लिए उनका उपयोग कर सकते हैं। बेशक, आप आमतौर पर मूल ब्लॉक में चर सेट करके या उपयोग करके अन्य दृष्टिकोणों के साथ समान परिणाम प्राप्त कर सकते हैं map। रेगेक्स दृष्टिकोण का नकारात्मक पक्ष यह है कि यदि आप विभिन्न स्थानों से मेल खाना चाहते हैं, तो यह बहुत कम हो सकता है, और रेगेक्स की निम्न पूर्वता हो सकता है केवल उन स्थानों के साथ फिट नहीं हो सकती है जो आप स्थानों से मेल खाना चाहते हैं - यह उल्लेख नहीं करना कि स्पष्ट रूप से प्रदर्शन प्रभाव हैं कुछ मामलों में regexes से।

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

यह भी ध्यान दें कि एक संबंधित समाधान है जिसे आप समान स्थितियों में उपयोग करने में सक्षम हो सकते हैं: नेस्टेड स्थान। विचार यह है कि आप एक बहुत ही सामान्य स्थान से शुरू करेंगे, कई संभावित मैचों के लिए कुछ कॉन्फ़िगरेशन को सामान्य रूप से लागू करेंगे, और फिर विभिन्न प्रकार के पथों के लिए अलग-अलग नेस्टेड स्थान हैं जिन्हें आप मिलान करना चाहते हैं। उदाहरण के लिए, ऐसा कुछ करना उपयोगी हो सकता है:

location /specialpages/ {
    # some config
    location /specialpages/static/ {
        try_files $uri $uri/ =404;
    }
    location /specialpages/dynamic/ {
        proxy_pass http://127.0.0.1;
    }
}

7

यह संक्षिप्त, कुशल और सिद्ध दृष्टिकोण है:

location ~ (patternOne|patternTwo){ #rules etc. }

तो एक ही स्थान ब्लॉक / नियमों को इंगित करने वाले सरल पाइप सिंटैक्स के साथ आसानी से कई पैटर्न हो सकते हैं।

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