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