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

Tob*_*bia 31 rewrite nginx reverse-proxy cookies

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

server {
  server_name external.domain.com;
  location / {
    proxy_pass http://backend.int/;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

如何让 nginx 重写Set-Cookie响应头的内容,替换;Domain=backend.int;Domain=external.domain.com

Host在这种情况下,不更改传递标头不是一种选择。

Apache httpd有此功能已有一段时间了,请参阅ProxyPassReverseCookieDomain,但我似乎找不到在 nginx 中执行相同操作的方法。

小智 28

从 1.1.15 开始,添加了 proxy_cookie_domain 选项以解决此问题。

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


小智 5

@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 
    '; 
}
Run Code Online (Sandbox Code Playgroud)