Set-Cookie'nin etki alanı bölümünü nginx reverse proxy'de nasıl yeniden yazarım?


26

Ben basit bir nginx ters proxy var:

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

Sorun, Set-Cookieyanıt başlıklarının içerdiğidir ;Domain=backend.int, çünkü arka uç, ters proxy'li olduğunu bilmez.

Nasıl içeriğini yeniden nginx yapabilirsiniz Set-Cookieyerine yanıt başlıkları ;Domain=backend.intile ;Domain=external.domain.com?

HostBaşlığı değiştirmeden geçirmek bu durumda bir seçenek değildir.

Apache httpd bir süredir bu özelliğe sahipti, bakın ProxyPassReverseCookieDomain, fakat aynısını nginx'te yapmanın bir yolunu bulamıyorum.


2
neden ana bilgisayar üstbilgisini geçmek bir seçenek değil? imo başlığın ana kısmı böyle şeyler için yapılmıştır. Hangi proxy'nin kullanıldığını geçmeniz gerekirse, ek başlıklar sağlamalısınız.
jojoo

1
Sanal barındırma yapan eski bir sunucunuz olduğunu ve bu hizmetlerden bazılarını yeni bir etki alanında yayınlamak için Nginx'i önüne koymak istediğinizi varsayalım. Eski sunucunun yapılandırmasını değiştiremeyeceğinizi (veya istemeyeceğinizi) de varsayalım. Nginx, çerez alanı sorunu hariç eski hizmetleri yeni sitelerde yayınlamak için gereken tüm araçları içerir.
Tobia,

Yanıtlar:



5

@Shamer'ınSet-Cookie yanıtı çoklu yanıt başlıklarıyla iyi çalışıyor , ancak yalnızca bir tanesi varsa başarısız oluyor. Ajan, başvurulan iş parçacığının sonunda işaret ettiği gibi, if type(cookies) ~= "table" then cookies = {cookies} endbu davayı ele almak için gerekli.

İşte her şey:

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

Bu soru nginx posta listesinde [1] ortaya çıktı. Bunu doğrudan nginx'te yapmanın yolu yok. Ngx_lua modülünü kullanmaya başvurmanız gerekir (> = v0.3.1).

"Agentzh" kullanıcısı bunun config dosyasında belirtilen gibi göründüğünün bir örneğine sahiptir:

    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 
        '; 
    } 

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


2
Doğru cevap için teşekkür ederim, ancak geçmişte ngx_lua ile kötü bir deneyim yaşadım: Kötü bellek sızıntısı. Nginx'in cookie domain rewriting gibi bir kaç özel talimat olmasa da, yerleşik regexp motorunu kullanan bazı basit başlık manipülasyon ilkelerine ihtiyacı olduğunu düşünüyorum.
Tobia,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.