如何重写Nginx反向代理中的Set-Cookie的域部分?

我有一个简单的nginx反向代理

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

问题是Set-Cookie响应头包含;Domain=backend.int ,因为后端不知道它被反向代理。

我怎样才能让nginx重写Set-Cookie响应头的内容,用;Domain=external.domain.comreplace;Domain=backend.int

在这种情况下,不改变Host头不是一个选项。

Apache的httpd已经有了这个function一段时间,请参阅ProxyPassReverseCookieDomain ,但我似乎无法find一种方法来做同样的nginx。

从1.1.15开始,添加了proxy_cookie_domain选项来解决这个问题。

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

@shamer的答案可以很好地处理多个Set-Cookie响应头文件,但如果只有一个响应头文件则会失败。 正如agentzh在引用的线程末尾指出的那样, if type(cookies) ~= "table" then cookies = {cookies} end就是处理这种情况所必需的。

这是整个事情:

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

这个问题出现在nginx的邮件列表中[1]。 在nginx中没有办法直接这样做。 您必须求助于使用ngx_lua模块(> = v0.3.1)。

用户“agentzh”有一个这样的内容在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