web-dev-qa-db-fra.com

Comment réécrire la partie domaine de Set-Cookie dans un proxy inverse nginx?

J'ai un simple proxy inverse nginx:

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

Le problème est que Set-Cookie les en-têtes de réponse contiennent ;Domain=backend.int, car le backend ne sait pas qu'il est en cours de proxy inverse.

Comment puis-je faire réécrire nginx le contenu du Set-Cookie en-têtes de réponse, remplaçant ;Domain=backend.int avec ;Domain=external.domain.com?

Le passage de l'en-tête Host inchangé n'est pas une option dans ce cas.

Apache httpd a cette fonctionnalité depuis un moment, voir ProxyPassReverseCookieDomain, mais je n'arrive pas à trouver un moyen de faire la même chose dans nginx.

27
Tobia

À partir de la version 1.1.15, l'option proxy_cookie_domain a été ajoutée pour résoudre ce problème.

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

22
rrehbein

La réponse de @shamer fonctionne bien avec plusieurs en-têtes de réponse Set-Cookie, Mais il échoue s'il n'y en a qu'un. Comme l'agentzh le souligne à la fin du thread référencé, if type(cookies) ~= "table" then cookies = {cookies} end est nécessaire pour gérer ce cas.

Voici le tout:

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

Cette question est apparue dans la liste de diffusion nginx [1]. Il n'y a aucun moyen de le faire directement dans nginx. Vous devez recourir à l'utilisation du module ngx_lua (> = v0.3.1).

L'utilisateur "agentzh" a un exemple de ce à quoi cela ressemblerait dans le fichier de configuration:

    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