कैसे nigx के साथ एक प्रॉक्सी_पास के माध्यम से क्वेरी स्ट्रिंग पैरामीटर को अग्रेषित किया जा सकता है?


114
upstream apache {
   server 127.0.0.1:8080;
}
server{
   location ~* ^/service/(.*)$ {
      proxy_pass http://apache/$1;
      proxy_redirect off;
   }
 }

उपरोक्त स्निपेट अनुरोधों को रीडायरेक्ट करेगा जहां url में स्ट्रिंग "सर्विस" को दूसरे सर्वर में शामिल किया गया है, लेकिन इसमें क्वेरी पैरामीटर शामिल नहीं हैं।

जवाबों:


163

से proxy_pass प्रलेखन:

एक विशेष मामला प्रॉक्सी_पास स्टेटमेंट में चर का उपयोग कर रहा है: अनुरोधित URL का उपयोग नहीं किया गया है और आप लक्ष्य URL का निर्माण करने के लिए पूरी तरह से जिम्मेदार हैं।

चूंकि आप लक्ष्य में $ 1 का उपयोग कर रहे हैं, nginx आप पर निर्भर करता है कि वह बताए कि वास्तव में क्या पास करना है। आप इसे दो तरीकों से ठीक कर सकते हैं। पहले, छद्म के साथ यूआरआई की शुरुआत को अलग करना तुच्छ है:

location /service/ {
  # Note the trailing slash on the proxy_pass.
  # It tells nginx to replace /service/ with / when passing the request.
  proxy_pass http://apache/;
}

या यदि आप रेगेक्स स्थान का उपयोग करना चाहते हैं, तो केवल args को शामिल करें:

location ~* ^/service/(.*) {
  proxy_pass http://apache/$1$is_args$args;
}

1
मुझे विश्वास नहीं है कि आप बाद में कर सकते हैं। मैंने कोशिश की और नगनेक्स ने मुझसे शिकायत की।
duma

3
शिकायत की कैसे? मैंने सिर्फ nginx 1.3.4 पर इसका परीक्षण किया और यह मेरे लिए ठीक काम किया।
kolbyjack

हम्म .. मैं अब याद नहीं कर सकता :( लेकिन मुझे ऐसा लगता है कि यह "~ *" से संबंधित हो सकता है। हालांकि, मैंने अभी-अभी जाँच की है, और मेरे पास नग्नेक्स 1.2.3 (होमब्रे के माध्यम से) है। हो सकता है कि यह हो?
duma

"प्रॉक्सी_डायरेक्ट डिफ़ॉल्ट" का प्रयोग चर के साथ "प्रॉक्सी_पास" निर्देश के साथ नहीं किया जा सकता है
जीन-फिलिप कारुआना

1
फिर से लिखना होगा location /service/ { rewrite ^\/service\/(.*) /$1 break; proxy_pass http://apache; }
एंड्रयू अर्नाटोव

27

मैं ~इसके बजाय kolbyjack के दूसरे दृष्टिकोण के थोड़ा संशोधित संस्करण का उपयोग करता हूं ~*

location ~ ^/service/ {
  proxy_pass http://apache/$uri$is_args$args;
}

10

मैंने इसे काम करने के लिए @kolbyjack कोड को संशोधित किया

http://website1/service
http://website1/service/

मापदंडों के साथ

location ~ ^/service/?(.*) {
    return 301 http://service_url/$1$is_args$args;
}

1
यह ध्यान रखें कि सर्वर क्लाइंट को रीडायरेक्ट करने से पहले 301 प्रतिसाद लौटाएगा। proxy_passनिर्देश ऊपर सर्वर साइड पर पुनर्निर्देशन करता है।
ल्यूक पीटरसन

1
यदि आपके क्वेरी पैरामीटर में URL (%) एन्कोड किए गए वर्ण हैं, तो यह टूट जाएगा। इसके बजाय एंड्रयू के जवाब का उपयोग करें।
डेविड वेबर

9

आपको प्रॉक्सी_पास का उपयोग करके पासर्स को फिर से लिखने के लिए उपयोग करना है यहाँ उदाहरण है कि मैंने s3 के लिए कोणीयज एप्लिकेशन अपॉइंटमेंट के लिए किया

S3 स्टेटिक वेबसाइट होस्टिंग रूट सभी मार्गों को Index.html पर ले जाता है

अपनी आवश्यकताओं के लिए अपनाया कुछ इस तरह होगा

location /service/ {
    rewrite ^\/service\/(.*) /$1 break;
    proxy_pass http://apache;
}

यदि आप http://127.0.0.1:8080/query/params/ में समाप्त करना चाहते हैं

अगर आप http://127.0.0.1:8080/service/query/params/ को समाप्त करना चाहते हैं, तो आपको कुछ इस तरह की आवश्यकता होगी

location /service/ {
    rewrite ^\/(.*) /$1 break;
    proxy_pass http://apache;
}

1
ऐसा लग रहा है कि यह पथ परम ( /path/params) अच्छी तरह से संभालता है, लेकिन क्वेरी परम ( ?query=params) नहीं?
विल

नहीं, मेरी गलती, क्वेरी मापदंडों को स्वचालित रूप से जोड़ा जाना चाहिए (वे मेरे परीक्षण में हैं)।
विल

2

github gist https://gist.github.com/anjia0532/da4a17f848468de5a374c860b17607e7

#set $token "?"; # deprecated

set $token ""; # declar token is ""(empty str) for original request without args,because $is_args concat any var will be `?`

if ($is_args) { # if the request has args update token to "&"
    set $token "&";
}

location /test {
    set $args "${args}${token}k1=v1&k2=v2"; # update original append custom params with $token
    # if no args $is_args is empty str,else it's "?"
    # http is scheme
    # service is upstream server
    #proxy_pass http://service/$uri$is_args$args; # deprecated remove `/`
    proxy_pass http://service$uri$is_args$args; # proxy pass
}

#http://localhost/test?foo=bar ==> http://service/test?foo=bar&k1=v1&k2=v2

#http://localhost/test/ ==> http://service/test?k1=v1&k2=v2

1

बिना क्वेरी स्ट्रिंग को पुनर्निर्देशित करने के लिए सर्वर पोर्ट के तहत सर्वर ब्लॉक में लाइनों को नीचे जोड़ें:

if ($uri ~ .*.containingString$) {
           return 301 https://$host/$uri/;
}

क्वेरी स्ट्रिंग के साथ:

if ($uri ~ .*.containingString$) {
           return 301 https://$host/$uri/?$query_string;
}

1
ifजब संभव हो तो उपयोग करने से बचने में नेगनेक्स प्रलेखन स्पष्ट है। इस मामले में, समाधान सही उपयोग हो सकता है locationजैसा कि दूसरे उत्तरों में दिखाया गया है।
एंड्रेस मोरालेस

2
वैसे भी कमियां होने पर भी एक और उपाय बेहतर है
दिमित्री मालुगिन

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