Cookies
如何在 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=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 '; }