Nginx रिवर्स प्रॉक्सी में सेट-कुकी के डोमेन भाग को फिर से कैसे लिखना है?


26

मेरे पास एक सरल nginx रिवर्स प्रॉक्सी है:

server {
  server_name external.domain.com;
  location / {
    proxy_pass http://backend.int/;
  }
}

समस्या यह है कि Set-Cookieप्रतिक्रिया हेडर होते हैं ;Domain=backend.int, क्योंकि बैकेंड को नहीं पता होता है कि यह रिवर्स प्रिक्सिड है।

मैं कैसे की सामग्री को फिर से लिखने nginx कर सकते हैं Set-Cookieप्रतिक्रिया हेडर, की जगह ;Domain=backend.intके साथ ;Domain=external.domain.com?

Hostहेडर को अपरिवर्तित पास करना इस मामले में एक विकल्प नहीं है।

Apache httpd में कुछ समय के लिए यह सुविधा रही है, देखें ProxyPassReverseCookieDomain, लेकिन मुझे nginx में ऐसा करने का कोई तरीका नहीं मिल रहा है।


2
होस्ट हेडर क्यों पास कर रहा है एक विकल्प नहीं है? imo होस्ट का हिस्सा ऐसी चीजों के लिए बनाया गया है। यदि आपको पास करने की आवश्यकता है जो प्रॉक्सी का उपयोग किया गया था, तो आपको अतिरिक्त हेडर की आपूर्ति करनी चाहिए।
जजू

1
मान लीजिए कि आपके पास एक लीगेसी सर्वर है जो वर्चुअल होस्टिंग करता है और आप इनमें से कुछ सेवाओं को एक नए डोमेन पर प्रकाशित करने के लिए, Nginx को सामने रखना चाहते हैं। मान लीजिए कि आप विरासत सर्वर के कॉन्फ़िगरेशन को नहीं बदल सकते (या नहीं चाहते)। कुकी डोमेन समस्या को छोड़कर, नगनेक्स के पास नई साइटों पर विरासत सेवाओं को प्रकाशित करने के लिए आवश्यक सभी उपकरण हैं।
तोबिया

जवाबों:



5

@ शेमर का जवाब कई Set-Cookieप्रतिक्रिया हेडर के साथ ठीक काम करता है , लेकिन यह विफल रहता है अगर वहाँ सिर्फ एक है। जैसा कि Agentzh संदर्भित धागे के अंत में बताते हैं, if type(cookies) ~= "table" then cookies = {cookies} endउस मामले को संभालने के लिए आवश्यक है।

ये रही पूरी बात:

location / { 
    proxy_pass http://backend.int/;

    header_filter_by_lua '
        local cookies = ngx.header.set_cookie 
        if not cookies then return end
        if type(cookies) ~= "table" then cookies = {cookies} end
        local newcookies = {}
        for i, val in ipairs(cookies) do
            local newval = string.gsub(val, "([dD]omain)=[%w_-\\\\.]+", 
                      "%1=external.domain.com") 
            table.insert(newcookies, newval) 
        end 
        ngx.header.set_cookie = newcookies 
    '; 
}

2

यह सवाल नगनेक्स मेलिंग सूची [1] में आया था। Nginx में सीधे ऐसा करने का कोई तरीका नहीं है। आपको ngx_lua मॉड्यूल (> = v0.3.1) का उपयोग करने के लिए सहारा लेना होगा।

उपयोगकर्ता "Agentzh" का एक उदाहरण है कि यह विन्यास फाइल में इनबिल्ट की तरह दिखेगा:

    server_name external.domain.com; 

    location / { 
        proxy_pass http://backend.int/;

        header_filter_by_lua ' 
            local cookies = ngx.header.set_cookie 
            if not cookies then return end 
            local newcookies = {} 
            for i, val in ipairs(cookies) do 
                local newval = string.gsub(val, "([dD]omain)=[%w_-\\\\.]+", 
                          "%1=external.domain.com") 
                table.insert(newcookies, newval) 
            end 
            ngx.header.set_cookie = newcookies 
        '; 
    } 

[१] http://nginx.2469901.n2.nabble.com/Rewriting-the-domain-part-of-Set-Cookie-in-a-proxy-pass-td6453554.html


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