Nginx के अंदर HTTP रीडायरेक्ट का पालन कैसे करें?


15

मेरे पास एक nginx- आधारित HTTP प्रॉक्सी है और मैं इसके अंदर सभी HTTP पुनर्निर्देशन को संसाधित करना चाहूंगा ताकि ग्राहकों को पुनर्निर्देशित श्रृंखला में केवल अंतिम प्रतिक्रिया मिले।

मूल कोड इस तरह दिखता है:

location /proxy {
    rewrite ^/proxy/([^/]+) $1 break;

    proxy_pass http://$uri/;
}

1 स्तर के पुनर्निर्देशन के बाद मेरा प्रयास यह है:

error_page 301 302 307 =200 @redir;

... और इसका नाम स्थान है:

location @redir {
    proxy_pass $proxy_location;
}

केवल कोई $xy_location वैरिएबल नहीं है और मैं इसे बनाने का एक तरीका खोजने में विफल रहा। इसमें Location:अपस्ट्रीम से प्राप्त हेडर का मान होना चाहिए ।

कोई विचार?

जवाबों:


7

मेरा मानना ​​है कि आप चर $ upstream_http_location चाहते हैं ।

वेरिएबल्स जो $ प्रॉक्सी * से शुरू होते हैं, जो नगीनक्स से अपस्ट्रीम तक जाते हैं, को नियंत्रित करते हैं। $ अपस्ट्रीम * श्रृंखला के वेरिएबल्स में उस प्रतिक्रिया के बारे में जानकारी होती है जो नग्नेक्स को स्वयं प्राप्त होती है। आप $ upstream_http_headername के साथ एक अपस्ट्रीम सर्वर से प्राप्त कोई भी HTTP HTTP शीर्ष लेख प्राप्त कर सकते हैं।

ध्यान दें कि ये $ अपस्ट्रीम वैरिएबल कुछ भी नहीं हो सकते हैं, लेकिन जब तक अपस्ट्रीम सर्वर से प्रतिक्रिया नहीं मिलती है, तब तक इसके उपयोग की कुछ सीमाएं हैं।


26

यहाँ मेरे लिए काम करने का पूरा उदाहरण है:

server {
    ...

    location / {
        proxy_pass http://backend;
        # You may need to uncomment the following line if your redirects are relative, e.g. /foo/bar
        #proxy_redirect / /;
        proxy_intercept_errors on;
        error_page 301 302 307 = @handle_redirect;
    }

    location @handle_redirect {
        set $saved_redirect_location '$upstream_http_location';
        proxy_pass $saved_redirect_location;
    }
}

1
आपको एक नए चर में $ upstream_http_location का मान क्यों सहेजना पड़ा?
पार्थ शाह

1
मुझे सटीक कारण नहीं पता, लेकिन यह अन्यथा काम नहीं करता है ...
व्लाद फ्रोलोव

यह बहुत अच्छा है लेकिन केवल एक ही रीडायरेक्ट को पकड़ता है। किसी भी तरह से कई पुनर्निर्देशन को संभालने के लिए?
ThiefMaster

1
@ThiefMaster मुझे विश्वास है कि यह उत्तर वही है जो आप खोज रहे हैं।
1

मुझे 2020/01/23 09:17:46 [error] 1394#0: *1 invalid URL prefix in "", client: xx.xx.28.3, server: www.example.com, request: "GET /test HTTP/1.1", host: "www.example.com"@handle_redirect ब्लॉक, किसी भी विचार का उपयोग करके निम्न त्रुटि मिल रही है?
सिरिल डचोन-डोरिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.