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