Come riscrivere la parte del dominio di Set-Cookie in un proxy inverso nginx?


26

Ho un semplice proxy inverso nginx:

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

Il problema è che le Set-Cookieintestazioni di risposta contengono ;Domain=backend.int, poiché il back-end non sa che è stato sottoposto a proxy inverso.

Come posso fare in modo che nginx riscriva il contenuto delle Set-Cookieintestazioni di risposta, sostituendolo ;Domain=backend.intcon ;Domain=external.domain.com?

Passare l' Hostintestazione invariata non è un'opzione in questo caso.

Apache httpd ha questa funzionalità da un po ', vedi ProxyPassReverseCookieDomain, ma non riesco a trovare un modo per fare lo stesso in nginx.


2
perché passare l'intestazione host non è un'opzione? imo la parte host dell'intestazione è fatta per queste cose. se è necessario passare il proxy utilizzato, è necessario fornire ulteriori intestazioni.
jojoo,

1
Supponiamo di avere un server legacy che esegue l'hosting virtuale e di voler mettere Nginx davanti a esso, per pubblicare alcuni di quei servizi su un nuovo dominio. Supponiamo inoltre che non sia possibile (o non si desideri) modificare la configurazione del server legacy. Nginx contiene tutti gli strumenti necessari per pubblicare servizi legacy su nuovi siti, ad eccezione del problema relativo al dominio dei cookie.
Tobia,

Risposte:



5

La risposta di @shamer funziona bene con Set-Cookieintestazioni a risposta multipla , ma fallisce se ce n'è solo una. Come sottolinea agentzh alla fine del thread di riferimento, if type(cookies) ~= "table" then cookies = {cookies} endè necessario per gestire quel caso.

Ecco il tutto:

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

Questa domanda è emersa nella mailing list di nginx [1]. Non c'è modo di farlo direttamente in nginx. Devi ricorrere all'uso del modulo ngx_lua (> = v0.3.1).

L'utente "agentzh" ha un esempio di come potrebbe apparire in linea nel file di configurazione:

    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
Grazie per la risposta corretta, anche se in passato ho avuto una brutta esperienza con ngx_lua: cattive perdite di memoria. Penso che Nginx abbia bisogno di alcune semplici primitive di manipolazione delle intestazioni utilizzando il suo motore regexp incorporato, se non qualche altra istruzione personalizzata come la riscrittura dei domini dei cookie.
Tobia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.