it-swarm.com.de

Wie schreibe ich den Domain-Teil von Set-Cookie in einen Nginx-Reverse-Proxy um?

Ich habe einen einfachen Nginx-Reverse-Proxy:

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

Das Problem ist, dass Set-Cookie Antwortheader ;Domain=backend.int Enthalten, da das Backend nicht weiß, dass es ein Reverse-Proxy ist.

Wie kann ich nginx veranlassen, den Inhalt der Set-Cookie - Antwortheader neu zu schreiben und ;Domain=backend.int Durch ;Domain=external.domain.com Zu ersetzen?

In diesem Fall ist es keine Option, den Header Host unverändert zu übergeben.

Apache httpd hat diese Funktion schon eine Weile, siehe ProxyPassReverseCookieDomain, aber ich kann anscheinend keinen Weg finden, dasselbe in Nginx zu tun.

27
Tobia

Ab 1.1.15 wurde die Option proxy_cookie_domain hinzugefügt, um dieses Problem zu beheben.

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_domain

22
rrehbein

Die Antwort von @shamer funktioniert gut mit mehreren Set-Cookie Antwortheadern, aber es schlägt fehl, wenn es nur einen gibt. Wie agentzh am Ende des Threads, auf den verwiesen wird, hervorhebt, wird if type(cookies) ~= "table" then cookies = {cookies} end benötigt, um diesen Fall zu behandeln.

Hier ist das Ganze:

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

Diese Frage tauchte in der Nginx-Mailingliste auf [1]. Es gibt keine Möglichkeit, dies direkt in Nginx zu tun. Sie müssen auf das Modul ngx_lua zurückgreifen (> = v0.3.1).

Der Benutzer "agentzh" hat ein Beispiel dafür, wie dies in der Konfigurationsdatei aussehen würde:

    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
shamer