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


26

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

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

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

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

路过Host头不变的是不会在这种情况下的一个选项。

Apache httpd拥有此功能已有一段时间了,请参阅参考资料ProxyPassReverseCookieDomain,但是我似乎找不到在nginx中实现此功能的方法。


2
为什么不能传递主机头?imo头的主机部分就是用于此类操作的。如果需要传递使用哪个代理,则应提供其他标头。
jojoo 2011年

1
假设您有一个做虚拟主机的旧服务器,并且想将Nginx放在它的前面,以便在新域中发布其中的一些服务。假设您也不能(或不想)更改旧服务器的配置。Nginx包含在Cookie站点问题之外在新站点上发布旧服务所需的所有工具。
Tobia 2012年

Answers:



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

2

这个问题出现在nginx邮件列表[1]中。在nginx中无法直接执行此操作。您必须求助于使用ngx_lua模块(> = v0.3.1)。

用户“ agentzh”在配置文件中内联了一个示例:

    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
感谢您提供正确的答案,尽管过去我对ngx_lua的使用经验很差:内存泄漏很差。我认为Nginx需要一些使用其内置的regexp引擎的简单标头操作原语,如果没有更多自定义指令(例如cookie域重写)的话。
Tobia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.