Nginx स्थान regex प्रॉक्सी पास के साथ काम नहीं करता है


43

मैं इन 2 स्थान निर्देशों को Nginx में काम करने की कोशिश कर रहा हूं, लेकिन Nginx को बूट करते समय मुझे कुछ त्रुटियां हो रही हैं।

   location ~ ^/smx/(test|production) {
        proxy_pass   http://localhost:8181/cxf;
    }

    location ~ ^/es/(test|production) {
        proxy_pass   http://localhost:9200/;
    }

यह त्रुटि मुझे प्राप्त हो रही है:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block

क्या यह किसी को परिचित लगता है? मुझे यहाँ क्या याद आ रहा है?

जवाबों:


48

Xaviar से महान जवाब के लिए एक छोटा सा अतिरिक्त :

यदि आप nginx से इतनी अच्छी तरह परिचित नहीं हैं, तो proxy_passनिर्देश के अंत में स्लैश को जोड़ने के बीच एक महत्वपूर्ण अंतर है ।

निम्नलिखित काम नहीं करता है:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend/;

लेकिन यह एक करता है:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

निर्देश /के अंत में होने वाला अंतर proxy_pass


1
उस अनुगामी ने /मेरी कॉन्फ़िगरेशन समस्या को ठीक कर दिया, उसे पकड़ना मुश्किल था, धन्यवाद!
योरच

मुझे पागल कर रहा था, यह इंगित करने के लिए धन्यवाद!
सिरिल जूल

20

यह आपको बताता है कि प्रॉक्सी पास निर्देशन में URI का उपयोग regex लोकेशन में नहीं किया जा सकता है। ऐसा इसलिए है क्योंकि nginx URI के हिस्से को locationब्लॉक में रेगेक्स से मेल नहीं कर सकता है क्योंकि यह proxy_passनिर्देशात्मक तरीके से पारित होता है ।

सीधे शब्दों में सोच भी आपके स्थान regex है /foo/(.*)/bar, और आपके द्वारा निर्दिष्ट proxy_pass http://server/test, nginx एक ऊपरी स्तर पर एक और एक करने के लिए अपने स्थान regex मैप करने के लिए होता है, क्योंकि आप के साथ खत्म नहीं करना चाहते /foo/test/bar/somethingलेकिन साथ /test/something। इसलिए यह मूल रूप से संभव नहीं है।

तो इस भाग के लिए निम्नलिखित काम करना चाहिए:

server {

   [ ... ]

    location ~ ^/smx/(test|production) {
        rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
        proxy_pass http://localhost:8181;
    }

    location ~ ^/es/(test|production) {
        rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
        proxy_pass http://localhost:9200;
    }

}

हालाँकि, लोकेशन ब्लॉक URI पैटर्न से मिलान करने के लिए पुनर्निर्देशन को फिर से लिखना संभव नहीं होगा क्योंकि यह वर्तमान URI को संसाधित किए जाने को फिर से लिखता है, जिससे रीराइट करने से पहले शुरुआती अनुरोध केLocation आधार पर हेडर को बदलना असंभव हो जाता है ।


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