2016-02-10 6 views
43

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

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

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

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

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

उत्तर

83

प्रयास करें

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

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

+11

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

+3

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

+1

यह समाधान मेरे लिए काम नहीं करता है; हालांकि @ स्टैम्सटर की टिप्पणी ने किया; मैं 'nginx/1.13.2' –

40

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

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

यहां नमूने shared.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 
"; 
+0

चला रहा हूं, क्या आप कृपया 'shared.conf' उदाहरण और स्थान जोड़ सकते हैं? –

+1

मैंने एक साझा shared.conf फ़ाइल जोड़ा है। आप shared.conf पर एक पूर्ण पथ का उपयोग कर सकते हैं या इसे अपनी nginx निर्देशिका में डाल सकते हैं। इस मामले में, इसमें केवल कुछ निर्देश शामिल हैं। –

7

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

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

यह वह जगह है छोटा है, अभी तक कुशल और सिद्ध दृष्टिकोण:

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

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

-1

विरासत मामले के लिए:

location /first { 
    # do some stuff here, and than go to /base 
    try_files /base; 
} 

location /second { 
    # do some other stuff here, and than go to /base 
    try_files /base; 
} 

location /base { 
    # base stuff here 
} 
+0

क्या यह मान्य है? [दस्तावेज़] (http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files) सुझाव देते हैं कि कम से कम एक फ़ाइल की आवश्यकता है। शायद आपको 'try_files file_that_will_never_exist.yml/base;' जैसी कुछ करने की आवश्यकता है। – Mike

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

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