Cookies

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

  • May 19, 2017

我有一個簡單的 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 中執行相同操作的方法。

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

引用自:https://serverfault.com/questions/278319